Programming Language/Python

[SQLAlchemy] 6. ORM을 사용한 UPDATE

LeeJaeJun 2024. 6. 22. 15:27
728x90
반응형

UPDATE 구문

  • update() 함수는 SQL의 UPDATE 구문을 생성
from sqlalchemy import update

stmt = (
    update(user_table)
    .where(user_table.c.name == "patrick")
    .values(fullname="Patrick the Star")
)

# UPDATE user_account SET fullname=:fullname WHERE user_account.name = :name_1
  • Update.values(): SET 절의 값을 설정. 여러 값을 업데이트할 때는 bindparam()을 사용하여 바인드 매개변수 설정
from sqlalchemy import update, bindparam
from sqlalchemy.orm import sessionmaker

SessionLocal = sessionmaker(bind=engine)

stmt = (
    update(user_table)
    .where(user_table.c.name == bindparam("oldname"))
    .values(name=bindparam("newname"))
)

with SessionLocal() as session:
    session.execute(
        stmt,
        [
            {"oldname": "jack", "newname": "ed"},
            {"oldname": "wendy", "newname": "mary"},
            {"oldname": "jim", "newname": "jake"},
        ],
    )
    session.commit()
  • subqeury() 활용
scalar_subq = select(address_table.c.email_address) # address_table의 email_address 컬럼을 선택하는 SELECT 쿼리
    .where(address_table.c.user_id == user_table.c.id) # address_table의 user_id가 user_table의 id와 일치하는 조건을 추가
    .order_by(address_table.c.id) # address_table의 id를 기준으로 오름차순 정렬
    .limit(1) # 결과를 하나의 행으로 제한
    .scalar_subquery() # 최종적으로 이 모든 조건을 포함하는 서브쿼리를 생성하여 단일 값을 반환

update_stmt = update(user_table).values(fullname=scalar_subq)
  • 다중 테이블 UPDATE
update_stmt = (
    update(user_table)
    .where(user_table.c.id == address_table.c.user_id)
    .where(address_table.c.email_address == "patrick@aol.com")
    .values(
        {
            user_table.c.fullname: "Pat",
            address_table.c.email_address: "pat@aol.com",
        }
    )
)
  • CursorResult.rowcount: 영향을 받은 행 수 얻기
with SessionLocal() as session:
    result = session.execute(
        update(user_table)
        .values(fullname="Patrick McStar")
        .where(user_table.c.name == "patrick")
    )
    session.commit()
    print(result.rowcount) # 업데이트된 행의 수를 출력

 

728x90
반응형