본문 바로가기

카테고리 없음

FastAPI sqlalchemy DB 쿼리 생성법

1. execute, scalars, scalar 차이

session.execute(stmt) -> Result 객체 반환

join이나 insert, update 하는 경우

 

session.execute(stmt).all()

table명을 지정하여 여러개 row select 하는 경우 (튜플 형태)

ex.  [Row(1, 'John'), Row(2, 'Alice')]

 

session.execute(stmt).first()

table명을 지정하여 1개 row select 하는 경우

 

session.scalars(stmt).all()

첫 번째 컬럼 값만 추출한 스칼라 값 리스트 반환 (스칼라 값 리스트)

ex. [1, 2, 3] - 단일 컬럼

[<User 1>, <User 2>] - ORM 객체 

 

session.scalars(stmt).first()

1개 row select 하는 경우

 

session.scalar(stmt)

단일 값 select 하는 경우

 

2-1. db.commit()을 하지 않는 경우(단순 조회)

scalars, scalar, scalar_one, scalar_one_or_none 차이

  반환 값  반환 타입 에러
scalars 리스트 반환 데이터 없으면 빈 리스트 반환
scalars().all() 여러 행 리스트 반환 데이터 없으면 빈 리스트 반환
scalars().first() 행 반환 데이터 없으면 None 반환
scalar 단일 값 첫 번째 행의 첫 번째 컬럼 값 데이터 없으면 None 반환
scalar_one 반드시 한 개 행의 첫번째 컬럼 값 데이터 없으면 NoResultFound,
2개 이상이면 MultipleResultsFound
scalar_one_or_none 한 개 행의 첫번째 컬럼 값
또는
None
2개 이상이면 MultipleResultsFound

user_uid를 조회할 땐, scalar, scalar_one, scalar_one_or_none 사용

user를 조회할 땐, scalars 사용

 

 

2-2. db.commit()을 하는 경우 (조인 조회, insert, update등등)

   execute()

   함수 내부에서 execute하자마자 data가 날라감.

   조회해 온 데이터 따로 변수에 저장해줘야함. 

   execute 후, 조회해올 경우 : execute(stmt).first()

 

 

추가 

.first()는 튜플을 반환함. 따라서 사용하기 위해서는 first()[0]을 해야하는데, 이때 값이 없으면 에러가 발생하니, 주의 

def insert_one_user(
    cpn_code_uid: str,
    enum_permission_user_code_uid: str,
) -> User:
    """
    Parameters:
        cpn_code_uid (str)
        enum_permission_user_code_uid (str)
    Returns:
        user (User)
    """
    # call db with session
    with get_db() as session:
        stmt = (
            insert(User)
            .values(
                cpn_code_uid=cpn_code_uid,
                enum_prmusr_code_uid=enum_permission_user_code_uid,
            )
            .returning(User)
        )
        
        # 실행 후 첫 번째 행을 반환
        user_model_tuple = session.execute(stmt).first()


    if user_model_tuple:
        return user_model_tuple[0]  # 첫 번째 값이 User 객체
    else:
        return None  # 결과가 없으면 None을 반환