Python 및 SQLAlchemy에서 여러 파일에서 SQLAlchemy 클래스 사용하기
Python 및 SQLAlchemy에서 여러 파일에서 SQLAlchemy 클래스 사용하기
모듈 가져오기:
먼저 모든 관련 모듈을 각 파일에 가져와야 합니다.
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
기본 클래스 정의:
모든 SQLAlchemy 클래스의 기본이 될 Base
클래스를 정의합니다.
Base = declarative_base()
클래스 정의:
각 파일에 Base
클래스를 상속받는 개별 클래스를 정의합니다.
class User(Base):
__tablename__ = 'users'
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String(255))
email = sa.Column(sa.String(255))
class Post(Base):
__tablename__ = 'posts'
id = sa.Column(sa.Integer, primary_key=True)
title = sa.Column(sa.String(255))
content = sa.Column(sa.Text)
user_id = sa.Column(sa.Integer, sa.ForeignKey('users.id'))
엔진 및 세션 설정:
데이터베이스에 연결하고 엔진 및 세션을 설정합니다.
engine = sa.create_engine('sqlite:///database.db')
Session = sa.orm.sessionmaker(bind=engine)
데이터베이스 테이블 생성:
모든 테이블을 생성합니다.
Base.metadata.create_all(engine)
데이터 작업:
세션을 사용하여 데이터베이스와 상호 작용합니다.
session = Session()
user = User(name='John Doe', email='[email protected]')
session.add(user)
session.commit()
post = Post(title='My First Post', content='Hello, world!', user_id=user.id)
session.add(post)
session.commit()
session.close()
여러 파일에서 클래스 사용:
다른 파일에서 정의된 클래스를 사용할 수 있습니다.
from models import User, Post
session = Session()
user = session.query(User).filter(User.email == '[email protected]').one()
print(user.name)
posts = session.query(Post).all()
for post in posts:
print(post.title)
session.close()
참고:
__tablename__
속성은 데이터베이스 테이블 이름을 지정합니다.primary_key
속성은 기본 키 열을 지정합니다.ForeignKey
속성은 관계를 정의합니다.sa.orm.sessionmaker
는 세션 클래스를 만듭니다.session.add
메서드는 데이터베이스에 추가할 객체를 추가합니다.session.commit
메서드는 변경 사항을 데이터베이스에 커밋합니다.session.query
메서드는 쿼리를 만듭니다.session.filter
메서드는 쿼리에 조건을 추가합니다.session.one
메서드는 쿼리 결과의 첫 번째 항목을 반환합니다.
Python 및 SQLAlchemy에서 여러 파일에서 SQLAlchemy 클래스 사용하기: 예제 코드
파일 1: models.py
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String(255))
email = sa.Column(sa.String(255))
class Post(Base):
__tablename__ = 'posts'
id = sa.Column(sa.Integer, primary_key=True)
title = sa.Column(sa.String(255))
content = sa.Column(sa.Text)
user_id = sa.Column(sa.Integer, sa.ForeignKey('users.id'))
파일 2: database.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('sqlite:///database.db')
Session = sessionmaker(bind=engine)
파일 3: main.py
from models import User, Post
from database import Session
session = Session()
user = User(name='John Doe', email='[email protected]')
session.add(user)
session.commit()
post = Post(title='My First Post', content='Hello, world!', user_id=user.id)
session.add(post)
session.commit()
session.close()
실행 방법:
models.py
,database.py
,main.py
파일을 같은 디렉터리에 저장합니다.- 다음 명령을 사용하여 Python 스크립트를 실행합니다.
python main.py
설명:
models.py
파일은User
및Post
데이터 모델을 정의합니다.database.py
파일은 데이터베이스 엔진 및 세션을 설정합니다.main.py
파일은 데이터베이스에 사용자 및 게시물을 추가합니다.
Python 및 SQLAlchemy에서 여러 파일에서 SQLAlchemy 클래스 사용하기: 대체 방법
패키지 사용:
모든 SQLAlchemy 클래스를 포함하는 Python 패키지를 만들 수 있습니다. 이렇게 하면 다른 파일에 from package import *
문을 사용하여 클래스를 쉽게 가져올 수 있습니다.
예제:
# package/models.py
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
# ...
class Post(Base):
# ...
# package/__init__.py
from .models import User, Post
from package import User, Post
# ...
중앙 저장소 사용:
모든 SQLAlchemy 클래스 정의를 포함하는 중앙 저장소를 만들 수 있습니다. 이 저장소를 다른 파일에 가져와 클래스에 액세스할 수 있습니다.
# models.py
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
# ...
class Post(Base):
# ...
# main.py
from models import Base, User, Post
engine = sa.create_engine('sqlite:///database.db')
Session = sa.orm.sessionmaker(bind=engine)
# ...
장점:
- 코드 조직화 개선
- 클래스 중복 방지
- 코드 재사용성 향상
단점:
- 설정이 조금 더 복잡할 수 있음
- 모든 파일에 저장소를 가져와야 함
별칭 사용:
긴 클래스 이름을 줄이려면 별칭을 사용할 수 있습니다.
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
User = Base.declarative_base(
name='User',
columns=(
Column('id', Integer, primary_key=True),
Column('name', String(255)),
Column('email', String(255)),
)
)
Post = Base.declarative_base(
name='Post',
columns=(
Column('id', Integer, primary_key=True),
Column('title', String(255)),
Column('content', sa.Text),
Column('user_id', Integer, ForeignKey('users.id')),
)
)
from models import User, Post
# ...
- 긴 클래스 이름 줄임
- 모든 클래스에 별칭을 정의해야 함
python sqlalchemy