객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 도구이다. ORM을 사용하면 개발자가 SQL 쿼리 대신 코드로 객체와 메서드를 사용하여 데이터베이스를 조작할 수 있다.
SQLAlchemy는 파이썬 데이터베이스 ORM 라이브러리로 Python 코드를 이용하여 객체 지향적으로 데이터를 조작할 수 있게 한다.
2️⃣-1️⃣ 데이터베이스 연결 및 세션 관리
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 데이터베이스 URL (예: SQLite 사용)
DATABASE_URL = "sqlite:///./test.db"
# 엔진 생성
engine = create_engine(DATABASE_URL, echo=True)
# 모델의 기본 클래스 생성
Base = declarative_base()
# 세션 생성
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 세션 가져오기 함수
def get_session():
session = SessionLocal()
try:
yield session
finally:
session.close()
1.engine
2. Base
3.sessoion
2️⃣-2️⃣ 모델 정의
from sqlalchemy import Column, Integer, String
from db import Base
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
email = Column(String, unique=True, index=True)
2️⃣-3️⃣ 데이터 입력
from db import engine, get_session
from models import Base, User
# 테이블 생성
Base.metadata.create_all(bind=engine)
# 세션 가져오기
session = next(get_session())
# SQLAlchemy Core 사용 방법
stmt = insert(User).values(name="John Doe", email="john@example.com")
session.execute(stmt)
session.commit()
# ORM객체 사용 방법
new_user = User(name="John Doe", email="john@example.com")
session.add(new_user)
session.commit()
# 세션 종료
session.close()
print("Data inserted successfully.")
❗ session.close는 현재 데이터베이스를 변화를 주는 세션 객체는 종료한다는 의미이지 컨넥션을 끊는다는 의미가 아니다.
DB와의 물리적 연결을 완전히 끊기 위해서는 engine.dispose()을 사용한다.
2️⃣-4️⃣ 데이터 조회
from db import get_session
from models import User
from sqlalchemy import select
# 세션 가져오기
session = next(get_session())
# SQLAlchemy Core 사용 방법
stmt = select(User).where(User.name == "John Doe")
result = session.execute(stmt)
user = result.scalar_one_or_none()
if user:
print(f"User: {user.name}, Email: {user.email}")
else:
print("User not found.")
# ORM을 통한 조회
user = session.query(User).filter(User.name == "John Doe").first()
if user:
print(f"User: {user.name}, Email: {user.email}")
else:
print("User not found.")
# 세션 종료
session.close()
📖참고하였거나 함께 읽어보면 좋은 글
파이썬 디비 비동기 처리-https://stopmin.tistory.com/entry/FastAPI-PostgreSQL-DB-트렌젝션-비동기-처리
SQLAlchemy (1) 기본 개념 및 동작 방식 - #세션 팩토리를 생성합니다. 자동 커밋과 자동 플러시를 비활성화
SQLAlchemy 1.x 와 2.0의 Query 스타일 비교- https://daco2020.tistory.com/324