[파이썬] Peewee ForeignKeyField를 사용한 관계 설정

관계형 데이터베이스에서 테이블 간의 관계 설정은 매우 중요하다. 이를 위해 Peewee ORM의 ForeignKeyField를 사용하여 간단하게 관계를 설정할 수 있다. 이번 글에서는 Peewee의 ForeignKeyField를 사용하여 테이블간의 일대다(One-to-Many) 관계를 구현하는 방법에 대해 알아보겠다.

Peewee는 파이썬 객체와 관계형 데이터베이스 간의 매핑을 도와주는 ORM(Object-Relational Mapping) 라이브러리이다. ORM을 사용하면 데이터베이스와 작업할 때 SQL 쿼리를 직접 작성하지 않고도 파이썬 객체로 데이터를 다룰 수 있다.

일대다(One-to-Many) 관계

일대다 관계는 한 테이블의 레코드가 다른 테이블의 여러 레코드와 관계를 맺는 것을 의미한다. 예를 들어, 게시판(Board) 테이블과 게시물(Post) 테이블이 있다고 가정해보자. 하나의 게시판은 여러 개의 게시물을 가지고 있을 수 있다.

이러한 일대다 관계를 구현하기 위해 Peewee에서는 ForeignKeyField를 사용한다. ForeignKeyField는 다른 테이블의 기본 키(PK)와 관계를 맺는데 사용된다.

from peewee import *

# 데이터베이스 연결
database = SqliteDatabase('my_app.db')

# 게시판 모델
class Board(Model):
    name = CharField()
    # ...

# 게시물 모델
class Post(Model):
    title = CharField()
    content = TextField()
    board = ForeignKeyField(Board, backref='posts')

    class Meta:
        database = database

위의 예제에서 Post 모델의 board 필드는 Board 모델의 외래 키(ForeignKeyField)로 설정되어 있다. backref 매개변수를 사용하여 역참조를 설정했다. 이렇게 하면 board에 속한 모든 게시물에 액세스할 수 있는 속성이 생성된다.

사용 예시

# 데이터베이스 연결
database.connect()
database.create_tables([Board, Post])

# 게시판 생성
board = Board.create(name='자유게시판')

# 게시물 생성
post1 = Post.create(title='첫 번째 게시물', content='안녕하세요!')
post2 = Post.create(title='두 번째 게시물', content='반갑습니다!')

# 게시판과 게시물 연결
post1.board = board
post2.board = board

# 저장
post1.save()
post2.save()

# 특정 게시판의 모든 게시물 조회
board_posts = board.posts
for post in board_posts:
    print(f'Title: {post.title}, Content: {post.content}')

# 데이터베이스 연결 해제
database.close()

위의 코드에서는 BoardPost를 생성하고 boardpost를 연결하는 과정을 보여준다. board.posts는 해당 게시판에 속한 모든 게시물을 가져오는 역참조이다.

Peewee의 ForeignKeyField를 사용하면 간단하게 일대다 관계를 구현할 수 있다. 이를 통해 객체 간의 관계를 쉽게 표현하고 데이터베이스와 일관된 방식으로 작업할 수 있다.