SQLAlchemy에서 UPDATE
를 수행하는 방법은 두 가지로 나눌 수 있습니다:
- ORM(Object Relational Mapping) 방식으로 업데이트: 모델 클래스를 사용하여 데이터를 객체처럼 다루면서 업데이트하는 방식입니다.
- SQL Expression 방식으로 업데이트: SQLAlchemy의
update()
함수와 함께 SQL 스타일의 쿼리를 작성하여 업데이트합니다.
각 방법에 대한 설명과 예시를 제공하겠습니다.
1. ORM 방식으로 업데이트
ORM 방식을 사용하면 SQLAlchemy 모델 클래스의 인스턴스를 수정한 후 session.commit()
을 호출하여 데이터베이스를 업데이트할 수 있습니다.
예시:
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from my_model import User # User 모델을 사용한다고 가정
# 데이터베이스 연결
engine = create_engine('sqlite:///mydatabase.db')
Session = sessionmaker(bind=engine)
session = Session()
# 업데이트할 객체를 검색
user_to_update = session.query(User).filter(User.id == 1).first()
# 객체의 필드를 수정
if user_to_update:
user_to_update.name = "New Name"
user_to_update.age = 30
# 세션에 변경 사항 반영 후 커밋
session.commit()
else:
print("User not found")
이 코드는 ORM 방식을 사용해 id
가 1인 User
객체의 name
과 age
필드를 업데이트한 후 session.commit()
으로 변경 사항을 커밋합니다.
2. SQL Expression 방식으로 업데이트
SQL Expression 방식에서는 직접 SQL 스타일로 update()
문을 사용하여 데이터를 수정할 수 있습니다.
예시:
from sqlalchemy import create_engine, update
from sqlalchemy.orm import sessionmaker
from my_model import User # User 모델을 사용한다고 가정
# 데이터베이스 연결
engine = create_engine('sqlite:///mydatabase.db')
Session = sessionmaker(bind=engine)
session = Session()
# 업데이트 쿼리 작성 및 실행
stmt = (
update(User)
.where(User.id == 1)
.values(name="New Name", age=30)
)
session.execute(stmt)
# 세션에 변경 사항 반영 후 커밋
session.commit()
위 코드는 SQLAlchemy의 update()
함수를 사용하여 SQL 스타일로 id
가 1인 User
객체의 name
과 age
필드를 업데이트한 후 session.commit()
으로 변경 사항을 저장합니다.
요약:
- ORM 방식은 객체지향적으로 접근하며 모델 인스턴스를 수정하고
commit()
합니다. - SQL Expression 방식은 SQL 스타일로 업데이트 쿼리를 작성하여 좀 더 명시적으로 SQL 업데이트 작업을 수행할 수 있습니다.
ORM 방식과 SQL Expression 방식 사이에는 약간의 속도 차이가 있을 수 있습니다. 그 이유는 두 방식이 데이터베이스와 상호작용하는 방식이 약간 다르기 때문입니다. 하지만 차이는 일반적으로 큰 차이가 없으며, 성능을 결정짓는 요인은 데이터베이스 크기, 네트워크 레이턴시, 트랜잭션 처리 등 다양한 요소가 영향을 미칩니다.
각 방식에서의 성능 차이 분석:
- ORM 방식:
- ORM 방식은 객체를 조회한 후에 수정하는 흐름을 따릅니다.
- 즉, 업데이트할 객체를 먼저
SELECT
로 가져와서 메모리에 로드한 후에 수정하고commit()
시점에서 데이터베이스에UPDATE
문을 실행합니다. - 이 과정에서는 데이터를 가져오기 위한 추가적인
SELECT
쿼리가 발생합니다. - ORM은 데이터베이스의 상태를 추적하는 데 추가적인 오버헤드가 있습니다. SQLAlchemy의 세션은 객체의 상태 변화를 추적하고 이 변화를 자동으로 데이터베이스에 반영합니다.
- 데이터를 메모리에 로드하는
SELECT
쿼리가 발생하므로, 조회할 데이터의 양이 많아질수록 성능에 영향을 미칩니다. - 또한, 객체의 상태를 추적하고 관리하는 과정에서 추가적인 오버헤드가 발생합니다.
- SQL Expression 방식:
- SQL Expression 방식은 직접 SQL 쿼리를 사용하여 곧바로
UPDATE
문을 실행합니다. - 이 방식은 객체를 메모리로 불러오지 않고, 데이터베이스에서 바로
UPDATE
작업을 수행합니다. - 즉,
SELECT
를 통해 데이터를 미리 가져오지 않으므로 불필요한 데이터 로드 작업이 생략됩니다.
- 객체를 메모리로 로드하지 않고 곧바로 SQL 쿼리를 실행하므로, 데이터 조회의 오버헤드가 줄어듭니다.
- ORM의 상태 추적 등의 추가적인 처리가 없기 때문에 좀 더 가볍게 동작합니다.
- SQL Expression 방식은 직접 SQL 쿼리를 사용하여 곧바로
성능 차이 요약:
- ORM 방식은 객체를 먼저 불러오고 수정한 후에 다시 저장하는 과정에서 추가적인
SELECT
쿼리와 상태 추적 작업이 필요하기 때문에, 작은 규모의 데이터에서는 크게 문제가 되지 않지만 대규모 데이터 처리에서는 더 느릴 수 있습니다. - SQL Expression 방식은 직접적으로 SQL 쿼리를 실행하므로, ORM 방식보다 불필요한 오버헤드가 적고 더 빠를 수 있습니다. 특히, 대량의 데이터를 업데이트할 때 성능 이점이 더 두드러질 수 있습니다.
언제 어떤 방식을 사용하는 것이 좋은가?
- ORM 방식은 코드의 가독성이 더 좋고, 객체 지향적으로 데이터를 다룰 수 있으며, 작은 규모의 데이터 업데이트에 적합합니다. 단일 객체 업데이트 또는 간단한 CRUD 작업에서는 성능 차이가 크지 않을 수 있습니다.
- SQL Expression 방식은 대규모의 데이터 업데이트나 특정 조건에 따라 데이터를 일괄 업데이트할 때 더 효율적입니다. 성능 최적화가 중요한 상황에서는 이 방식을 사용하는 것이 유리할 수 있습니다.
결론:
두 방식 간에 일반적인 작업에서는 성능 차이가 크지 않을 수 있지만, 대규모 데이터를 처리하거나 대량의 레코드를 한 번에 업데이트할 때는 SQL Expression 방식이 더 빠르고 효율적입니다.
만약 성능이 중요한 작업이라면, 두 방법을 비교하여 프로파일링을 통해 실제 성능 차이를 확인해보는 것이 좋습니다.
'[====== Development ======] > Python' 카테고리의 다른 글
Python - match 문 (1) | 2024.11.04 |
---|---|
Python 용 vscode extention (0) | 2024.10.04 |
Python 누락된 패키지 찾는 방법 (0) | 2024.10.04 |
[Python] 변수 선언시 type hinting을 이용하여 타입을 명시하는 방법 (0) | 2024.06.20 |
Python과 AWS S3연동하기 (0) | 2023.10.31 |