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을 반환