1. SQLModel이란?
기존 Python SQL ORM 구현체인 SQLAlchemy와 검증 패키지 Pydantic을 결합한 Python 라이브러리이다.
데이터베이스 작업을 보다 간결하고 직관적으로 수행할 수 있다.
SQLAlchemy의 ORM 기능을 유지하면서도 Pydantic의 데이터 검증 기능을 제공하는 것이 특징이다.
2. SQLAlchemy vs SQLModel
SQLAlchemy는 두 가지 주요 API 스타일을 제공한다.
- SQLAlchemy Core: 저수준 SQL 표현을 사용하여 SQL을 직접 다룰 수 있도록 설계됨
- SQLAlchemy ORM: 객체-관계 매핑(Object-Relational Mapping)을 통해 Python 클래스로 DB 모델을 다룰 수 있음
SQLModel은 SQLAlchemy ORM을 기반으로 동작하며, 다음과 같은 차이점이 있다.
특징 | SQLAlchemy | SQLModel |
데이터검증 | 없음 | Pydantic 기반 검증 |
필드 선언 방식 | Column() 사용 | Python 타입 힌트와 Field() 사용 |
간결성 | 상대적으로 복잡 | 상대적으로 간결 |
3. 코드 예시
1. 모델 정의
SQLAlchemy
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.orm import declarative_base, sessionmaker
Base = declarative_base()
class User(Base):
__tablename__ = "user"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, nullable=False)
age = Column(Integer, nullable=False)
SQLModel
from sqlmodel import SQLModel, Field
class User(SQLModel, table=True):
id: int = Field(primary_key=True)
name: str
age: int
2. 데이터 삽입
SQLAlchemy
SessionLocal = sessionmaker(bind=engine)
session = SessionLocal()
user = User(name="Alice", age=25)
session.add(user)
session.commit()
session.close()
SQLModel
from sqlmodel import Session
with Session(engine) as session:
user = User(name="Alice", age=25)
session.add(user)
session.commit()
3. 데이터 조회
SQLAlchemy
session = SessionLocal()
users = session.query(User).filter(User.age > 20).all()
for user in users:
print(user.name, user.age)
session.close()
SQLModel
from sqlmodel import select
with Session(engine) as session:
statement = select(User).where(User.age > 20)
results = session.exec(statement)
for user in results:
print(user.name, user.age)
4. 비동기 구현
SQLAlchemy 1.4 부터 비동기(async) 지원이 추가되어, SQLModel도 이를 활용해 비동기 세션을 사용할 수 있다.
1. SQLAlchemy 비동기 엔진 생성 (SQLModel도 동일)
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
DATABASE_URL = "sqlite+aiosqlite:///database.db"
async_engine = create_async_engine(DATABASE_URL, echo=True)
2-1. SQLAlchemy 비동기 세션 생성 및 활용
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
import asyncio
async def get_users():
async with AsyncSession(async_engine) as session:
statement = select(User)
results = await session.execute(statement)
users = results.scalars().all()
for user in users:
print(user.name, user.age)
asyncio.run(get_users())
2-2. SQLModel : SQLAlchemy의 비동기 엔진 활용
아직 별도의 비동기 ORM 기능 내장 x -> SQLModel 래퍼가 동기적으로 작동
from sqlmodel.ext.asyncio.session import AsyncSession
async def get_users_sqlmodel():
async with AsyncSession(async_engine) as session:
statement = select(User)
results = await session.execute(statement)
users = results.scalars().all()
for user in users:
print(user.name, user.age)
asyncio.run(get_users_sqlmodel())
4. 정리
SQLModel은 의 강력한 기능과 Pydantic의 데이터 검증 기능을 결합한 라이브러리로, 간결하고 직관적인 코드가 가능
- SQLModel = SQLAlchemy ORM + Pydantic 데이터 검증
- FastAPI 와 높은 호환성 (개발자가 FastAPI 개발자 중 한 명)
- 다만 아직 비동기 기능이 자체 탑재 되지 못하고 SQLAlchemy를 직접 활용해야 한다.
'🚀 Backend' 카테고리의 다른 글
[FastAPI] Best Practices - Project Structure (0) | 2025.02.14 |
---|---|
[SQL] SELECT 관련 함수 (0) | 2025.02.05 |
[Security] 스프링 시큐리티 (0) | 2024.02.27 |
[Spring Basic] 스프링 싱글톤 (0) | 2024.01.18 |
[Spring Basic] 스프링 컨테이너와 빈 (0) | 2024.01.18 |