[파이썬] web2py에서의 데이터베이스 관계

web2py는 파이썬에서 웹 애플리케이션을 개발하기 위한 프레임워크로서, 데이터베이스와의 관계를 손쉽게 구축하고 관리할 수 있는 기능을 제공합니다. 이번 블로그 포스트에서는 web2py에서의 데이터베이스 관계에 대해 알아보겠습니다.

데이터베이스 설정

web2py에서는 데이터베이스 연결 정보를 db.py 파일에 설정합니다. 이 파일에서 데이터베이스 설정과 테이블 정의를 할 수 있습니다. 아래는 MySQL 데이터베이스에 연결하는 예제입니다.

# db.py

from gluon.contrib.appconfig import AppConfig

# 설정 파일(appconfig.ini)로부터 데이터베이스 연결 정보를 가져옴
myconf = AppConfig(reload=True)

# 데이터베이스 설정
db = DAL(myconf.take('db.uri'),
         pool_size=myconf.take('db.pool_size', cast=int),
         migrate_enabled=myconf.take('db.migrate', cast=bool),
         migrate=myconf.take('db.migrate_suffix'),
         check_reserved=['all'])

위의 예제에서는 db.uri와 같은 설정을 사용하여 데이터베이스 연결을 설정하였습니다. 또한, migrate_enabled 옵션을 통해 데이터베이스 마이그레이션을 활성화할 수 있습니다.

테이블 정의

web2py에서는 테이블을 정의하기 위해 db.define_table() 함수를 사용합니다. 테이블 정의는 db.py 파일이나 웹 애플리케이션의 모델 파일에 작성할 수 있습니다. 아래는 users 테이블을 정의하는 예제입니다.

# db.py 혹은 모델 파일

# users 테이블 정의
db.define_table('users',
                Field('name', 'string', required=True),
                Field('email', 'string', required=True, unique=True),
                Field('password', 'password', required=True),
                Field('created_on', 'datetime', default=request.now),
                format='%(name)s')

# users 테이블 인덱스 생성
db.users.email.requires = IS_EMAIL()
db.users.name.requires = IS_NOT_EMPTY()

위의 예제에서는 db.define_table() 함수를 사용하여 users 테이블을 정의하였습니다. 각 필드의 데이터 타입과 제약 조건을 설정할 수 있으며, format 옵션을 통해 테이블의 출력 형식을 설정할 수도 있습니다.

데이터베이스 관계 설정

web2py에서는 관계형 데이터베이스의 관계를 간편하게 설정할 수 있습니다. 예를 들어, users 테이블과 posts 테이블이 1:N 관계일 경우, 아래와 같이 관계 설정을 할 수 있습니다.

# db.py 혹은 모델 파일

# posts 테이블 정의
db.define_table('posts',
                Field('title', 'string', required=True),
                Field('content', 'text', required=True),
                Field('created_by', 'reference users', required=True),
                Field('created_on', 'datetime', default=request.now))

위의 예제에서 created_by 필드는 users 테이블과의 관계를 설정한 것입니다. 이를 통해 posts 테이블의 레코드가 특정 사용자와 연결될 수 있습니다. 이제 created_by 필드를 통해 사용자와 게시글을 연결하여 쿼리를 수행할 수 있습니다.

# 웹 애플리케이션의 컨트롤러

# 사용자의 게시글 목록을 조회하는 컨트롤러 함수
def user_posts():
    user_id = request.args(0)
    user_posts = db(db.posts.created_by == user_id).select()
    return dict(posts=user_posts)

위의 예제에서는 db.posts.created_by == user_id 조건을 통해 특정 사용자의 게시글을 조회하고 있습니다. 이렇게 간단하게 데이터베이스 관계를 설정하면서 웹 애플리케이션의 기능을 구현할 수 있습니다.

마무리

web2py의 강력한 데이터베이스 관계 설정 기능을 통해 데이터베이스와의 상호작용을 손쉽게 할 수 있습니다. 이번 포스트에서는 데이터베이스 설정, 테이블 정의, 그리고 데이터베이스 관계 설정에 대해 알아보았습니다. web2py를 활용하여 웹 애플리케이션을 개발할 때, 이러한 기능들을 적절히 활용하여 더욱 효율적이고 유지보수가 용이한 코드를 작성할 수 있습니다.