Lucian Log
Blog
Computer Science
Algorithm
DB
Network
OS
General
AI
Blockchain
Concurrency
ETC
Git
Infrastructure
AWS
Docker
Java-Ecosystem
JPA
Java
Spring
JavaScript-Ecosystem
JavaScript
Next.js
React
TypeScript
Python-Ecosystem
Django
FastAPI
Python
SQLAlchemy
Software Engineering
Architecture
Culture
Test
Home
Contact
Copyright © 2024 |
Yankos
Home
>
Python-Ecosystem
> SQLAlchemy
Now Loading ...
SQLAlchemy
비동기 SQLAlchemy 기본
비동기 SQLAlchemy SQLAlchmey 1.4 이상부터 비동기 문법 지원 시작 비교적 최근에 나와 문법이 불안정한 느낌이지만, DB 비동기 처리는 FastAPI의 성능을 크게 향상 시킬 지점 주요 비동기 지원 모듈: sqlalchemy.ext.asyncio create_async_engine (비동기 데이터베이스 엔진) AsyncSession (비동기 세션) sessionmaker(class_=AsyncSession) (비동기 세션 팩토리) 기존 sessionmaker에 class_만 추가 비동기 Session 사용법 AsyncSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine, class_=AsyncSession) async def get_db(): async with AsyncSessionLocal() as session: yield session 테이블 초기 생성 async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) 조회 Syntax (2.0 스타일 코드) 조회 실행 await db.execute(...) select 객체로 SQL 쿼리를 조합해 execute 에 넣어 실행 모든 컬럼 조회 sqlalchemy.future 패키지에서 select를 import e.g. select(User) 특정 컬럼 조회 e.g. select(User.email) WHERE절 filter e.g. filter(User.nickname == 'veluga') 정렬 오름차순 정렬 order_by(User.id) 조회 방법 단건 조회 scalar() 복수 리스트 조회 scalars().all() 조회 결과의 개수 반환 from sqlalchemy import func result = await db.execute(select(func.count()).select_from(select(User))) count = result.scalars().one() 그룹화 및 집계 함수 사용 패턴 func에서 원하는 집계함수 사용 (count, sum, max, min…) from sqlalchemy import func result = await db.execute(select(func.count(User.id)).group_by(User.id)) result.scalars().all() 삭제 Syntax await db.delete("조회한 모델 객체") await db.commit()
Python-Ecosystem
· 2024-05-28
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 스타일 비교
Python-Ecosystem
· 2022-01-28
<
>
Touch background to close