Python, SQLAlchemy, Pyramid를 활용한 기존 데이터베이스 쿼리
Python, SQLAlchemy, Pyramid를 활용한 기존 데이터베이스 쿼리
본 문서에서는 Python, SQLAlchemy, Pyramid를 사용하여 기존 데이터베이스에 쿼리를 수행하는 방법을 설명합니다. SQLAlchemy는 Python용 객체 관계 매핑(ORM) 라이브러리이며, Pyramid는 Python 웹 프레임워크입니다.
환경 설정
- Python 3 이상
- SQLAlchemy 1.4 이상
- Pyramid 2.0 이상
- PostgreSQL 또는 SQLite 데이터베이스
SQLAlchemy 설정
- 프로젝트 폴더에
requirements.txt
파일을 생성하고 다음 라이브러리를 추가합니다.
sqlalchemy
psycopg2-binary (PostgreSQL 사용 시)
sqlalchemy-utils
alembic
패키지를 설치하여 데이터베이스 마이그레이션을 위한 환경을 설정합니다.
pip install alembic
alembic.ini
파일을 생성하고 다음 내용을 추가합니다.
[alembic]
script_location = ./alembic/migrations
sqlalchemy.url = postgresql://postgres:password@localhost:5432/mydb (PostgreSQL 사용 시)
sqlalchemy.url = sqlite:///mydb.sqlite (SQLite 사용 시)
데이터베이스 모델 정의
models.py
파일을 생성하고 SQLAlchemy 모델을 정의합니다.
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(255))
email = Column(String(255))
Pyramid 앱 설정
__init__.py
파일을 생성하고 다음 코드를 추가합니다.
from pyramid.config import Configurator
from sqlalchemy import create_engine
from .models import Base
def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
engine = create_engine(settings['sqlalchemy.url'])
Base.metadata.create_all(engine)
config = Configurator(settings=settings)
config.add_route('home', '/')
config.scan()
return config.make_wsgi_app()
from pyramid.view import view_config
@view_config(route_name='home')
def home(request):
# SQLAlchemy 세션 생성
session = request.db
# 데이터베이스 쿼리 실행
users = session.query(User).all()
# 쿼리 결과를 템플릿에 전달
return {'users': users}
템플릿
templates/home.jinja2
파일을 생성하고 다음 코드를 추가합니다.
{% for user in users %}
<div>
{{ user.name }} ({{ user.email }})
</div>
{% endfor %}
실행
alembic upgrade head
명령어를 실행하여 데이터베이스 마이그레이션을 수행합니다.python main.py
명령어를 실행하여 웹 서버를 시작합니다.- 웹 브라우저에서
http://localhost:8080/
주소를 열면 데이터베이스 쿼리 결과를 확인할 수 있습니다.
예제 코드
sqlalchemy
psycopg2-binary (PostgreSQL 사용 시)
sqlalchemy-utils
alembic.ini
[alembic]
script_location = ./alembic/migrations
sqlalchemy.url = postgresql://postgres:password@localhost:5432/mydb (PostgreSQL 사용 시)
sqlalchemy.url = sqlite:///mydb.sqlite (SQLite 사용 시)
models.py
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(255))
email = Column(String(255))
init.py
from pyramid.config import Configurator
from sqlalchemy import create_engine
from .models import Base
def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
engine = create_engine(settings['sqlalchemy.url'])
Base.metadata.create_all(engine)
config = Configurator(settings=settings)
config.add_route('home', '/')
config.scan()
return config.make_wsgi_app()
views.py
from pyramid.view import view_config
@view_config(route_name='home')
def home(request):
# SQLAlchemy 세션 생성
session = request.db
# 데이터베이스 쿼리 실행
users = session.query(User).all()
# 쿼리 결과를 템플릿에 전달
return {'users': users}
home.jinja2
{% for user in users %}
<div>
{{ user.name }} ({{ user.email }})
</div>
{% endfor %}
alembic upgrade head
명령어를 실행합니다.- 웹 브라우저에서
http://localhost:8080/
주소를 엽니다.
SQLAlchemy 기존 데이터베이스 쿼리 대체 방법
SQLAlchemy ORM을 사용하지 않고 직접 SQL 쿼리를 실행할 수 있습니다.
from sqlalchemy import create_engine
engine = create_engine('postgresql://postgres:password@localhost:5432/mydb')
# 데이터베이스 쿼리 실행
with engine.connect() as connection:
results = connection.execute('SELECT * FROM users')
# 쿼리 결과 처리
for row in results:
print(row)
SQL Expression Language (SQLAlchemy Core)
SQLAlchemy Core는 SQL 표현식을 Python 코드로 작성할 수 있도록 하는 기능을 제공합니다.
from sqlalchemy import create_engine, select
engine = create_engine('postgresql://postgres:password@localhost:5432/mydb')
# SQL 표현식 작성
stmt = select(User).where(User.name == 'John Doe')
# 쿼리 실행
with engine.connect() as connection:
results = connection.execute(stmt)
# 쿼리 결과 처리
for row in results:
print(row)
SQLAlchemy Declarative + MetaData
SQLAlchemy Declarative를 사용하지 않고 직접 MetaData
객체를 사용하여 테이블 정의와 쿼리를 수행할 수 있습니다.
from sqlalchemy import create_engine, MetaData, Table
engine = create_engine('postgresql://postgres:password@localhost:5432/mydb')
# 메타데이터 객체 생성
metadata = MetaData()
# 테이블 정의
users = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(255)),
Column('email', String(255))
)
# 쿼리 실행
with engine.connect() as connection:
results = connection.execute(select(users).where(users.c.name == 'John Doe'))
# 쿼리 결과 처리
for row in results:
print(row)
PonyORM
PonyORM은 SQLAlchemy와 유사한 기능을 제공하는 또 다른 Python ORM 라이브러리입니다.
from pony import orm
db = orm.Database('postgresql', user='postgres', password='password', host='localhost', database='mydb')
class User(db.Entity):
name = orm.Required(str)
email = orm.Required(str)
# 데이터베이스 쿼리 실행
users = orm.select(u for u in User if u.name == 'John Doe')
# 쿼리 결과 처리
for user in users:
print(user)
peewee
peewee는 또 다른 Python ORM 라이브러리입니다.
from peewee import SqliteDatabase, Model, CharField
db = SqliteDatabase('mydb.sqlite')
class User(Model):
name = CharField()
email = CharField()
# 데이터베이스 쿼리 실행
users = User.select().where(User.name == 'John Doe')
# 쿼리 결과 처리
for user in users:
print(user)
주의 사항
- 대체 방법마다 장단점이 존재합니다.
- 특정 프로젝트에 적합한 방법을 선택하는 것이 중요합니다.
python sqlalchemy pyramid