future 플래그 사용future 플래그 사용# 1.x 구문 (더 이상 지원안됨)
# stmt = select([table.c.x, table.c.y], whereclause=table.c.id == 5)
# 2.0 구문
from sqlalchemy import select
stmt = select(table.c.x, table.c.y).where(table.c.id == 5).order_by(table.c.id)
# 1.x 구문
user_obj = session.query(User).get(5)
# 2.0 구문
user_obj = session.get(User, 5)
# 2.0에서 권장하는 방법
with engine.connect() as conn:
result = conn.execute(text("SELECT * FROM table WHERE id = :id"), {"id": 1})
conn.commit() # 필요시 명시적 커밋
# 1.x 스타일
users = session.query(User).filter(User.name == "john").all()
# 2.0 스타일 (권장)
from sqlalchemy import select
stmt = select(User).where(User.name == "john")
users = session.execute(stmt).scalars().all()
# 새로운 import 위치
from sqlalchemy.orm import declarative_base, declared_attr # 2.0
# from sqlalchemy.ext import declarative_base, declared_attr # 1.x (구식)
from sqlalchemy.orm import registry, relationship
mapper_reg = registry()
Base = mapper_reg.generate_base()
# 명령형 매핑
mapper_reg.map_imperatively(
SomeClass,
some_table,
properties={"related": relationship(SomeRelatedClass)}
)
from sqlalchemy import create_engine, text
# future=True로 2.0 스타일 활성화
engine = create_engine("postgresql+psycopg2:///", future=True)
with engine.connect() as conn:
conn.execute(text("INSERT INTO table (x) VALUES (:x)"), {"x": 10})
conn.commit()
# 1.x 스타일
session.query(User).filter(User.name == "sandy").update(
{"password": "foobar"}, synchronize_session="fetch"
)
# 2.0 스타일
from sqlalchemy import update
stmt = (
update(User)
.where(User.name == "sandy")
.values(password="foobar")
.execution_options(synchronize_session="fetch")
)
session.execute(stmt)
metadata.create_all() 등에 명시적 엔진 필요# 환경 변수로 2.0 경고 활성화
import os
os.environ["SQLALCHEMY_WARN_20"] = "1"
이러한 변경사항들은 SQLAlchemy를 더 일관되고 명시적으로 만들어주며, Core와 ORM 사이의 차이점을 줄여줍니다.