Home > Python-Ecosystem > SQLAlchemy > SQLAlchemy 기본

SQLAlchemy 기본
Python ORM SQLAlchemy

SQLAlchemy

  • 동기 지원 모듈: sqlalchemy
    • create_engine (데이터베이스 엔진)
    • Session (세션)
    • sessionmaker (세션 팩토리)
  • ORM Setting 기본 단계
    • DB engine 생성 및 접속
    • 세션 정의 및 생성
    • 테이블 초기 생성

Session을 만드는 2가지 방법

  • Session 객체를 직접 생성
    • 사용 코드
        def get_db():
        db = Session(bind=engine)
        try:
            yield db
        finally:
            db.close()
      
    • FastAPI의 Depends(get_db)를 통해 의존성 주입하면 편리
  • Session 팩토리
    • 사용 코드
      • SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
      • db = SessionLocal()
      • db.close() - 사용 후에는 직접 끊어줘야 함
    • sessionmaker 옵션
      • autocommit
        • 세션 작업 후 자동으로 커밋되도록 활성화
        • False로 두고 명시적으로 커밋하는게 좋음
      • autoflush
        • 트랜잭션 안에서 바로바로 데이터 반영 시킬지 여부
        • 예를 들어, DB에 100개의 데이터가 있는데 현재 트랜잭션 내에서 insert 쿼리 후 count 쿼리를 날리면, autoflush가 true일 때 101개 결과를 반환
        • 과거 방식이기도 하고, False가 바람직

테이블 초기 생성

Base.metadata.create_all(bind=engine)

조회 Syntax

  • 모든 컬럼 조회
    • db.query("TableObjectName")
    • = SELECT * FROM TableName
    • e.g. db.query(User)
  • 특정 컬럼 조회
    • db.query("TableObjectName.columnname")
    • = SELECT columnname FROM TableName
    • e.g. db.query(User.email)
  • WHERE
    • filter
      • e.g. filter(User.nickname == 'veluga')
    • filter_by
      • e.g. filter_by(nickname="john")
  • AND & OR
    • AND
      • e.g. filter("조건").filter("조건")
      • e.g. filter("조건", "조건")
    • OR
      • or_을 임포트해 사용
      • from sqlalchemy import or_
      • e.g. filter(or_(User.username == "veluga", User.id == 1))
  • 정렬
    • 오름차순 정렬
      • order_by(User.id)
    • 내림차순 정렬
      • from sqlalchemy import desc
      • order_by(desc(User.id))
  • 조회 실행 (쿼리 실행)
    • 단건 조회
      • first()
        • 결과가 여러 개면 그 중 첫 번째 리턴
        • 없을 경우 None 반환
      • one()
        • 결과가 여러 개거나 없을 경우 에러
      • scalar()
        • 결과가 여러 개일 경우 에러
        • 없을 경우 None 반환
    • 복수 리스트 조회
      • all()
      • scalars()
  • 조회 결과의 개수 반환
    • count()
  • 그룹화 및 집계 함수 사용 패턴
    • func에서 원하는 집계함수 사용 (count, sum, max, min…)
        from sqlalchemy import func
      		
        db.query(func.count(User.id).label('total')).group_by(User.id).all()
      

삭제 Syntax

db.delete("조회한 모델 객체")
db.commit()

Reference

2.0 style query 결과 가져오기 총 정리 (한 개 또는 여러 개)
SQLAlchemy 1.x 와 2.0의 Query 스타일 비교