반응형
SQLAlchemy, 객체 값 업데이트 setattr ()
글. 수알치 오상문
SQLAlchemy에서 setattr() 함수는 ORM 데이터 객체의 속성 값 설정에 사용합니다. setattr() 사용은 단순히 속성 값 변경 이상의 의미가 있습니다. SQLAlchemy는 setattr() 함수를 통하여 ORM 객체 속성 값에 대한 변경사항을 추적하고, 데이터베이스에 반영할 수 있도록 합니다. 즉, setattr()을 이용하여 ORM 객체 속성 값을 변경하면 SQLAlchemy는 변경사항을 감지하고, 나중에 session.commit()을 호출할 때 데이터베이스에 업데이트 쿼리를 실행합니다.
setattr(user, 'age', 31)은 user.age = 31과 같은 효과를 갖습니다.
SQLAlchemy는 setattr()을 통해 age 속성 변경을 감지하고, session.commit()을 호출했을 때 데이터베이스에 업데이트 쿼리를 실행하여 변경사항을 반영합니다.
[주의] __dict__을 이용한 속성 값 변경
__dict__를 직접 사용하여 속성 값을 변경하면 SQLAlchemy는 변경사항을 감지하지 못합니다. 따라서 ORM 객체 속성 값을 변경할 때는 반드시 setattr()이나 속성에 직접 값을 할당하는 방식을 사용해야 합니다.
[예제 코드]
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///:memory:') # 데이터베이스 엔진 생성
Base = declarative_base() # 베이스 클래스 생성
# User 클래스 정의
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
Base.metadata.create_all(engine) # 테이블 생성
# 세션 생성
Session = sessionmaker(bind=engine)
session = Session()
# User 객체 생성 및 디비에 저장
user = User(name='John', age=30)
session.add(user)
session.commit()
setattr(user, 'age', 31) # setattr()을 사용하여 age 속성 변경
print(user.age) # 출력: 31
session.commit() # 데이터베이스에 변경 사항 반영
[예제 코드] SqlAlchemy ORM 객체에서 __dict__을 이용한 잘못된 업데이트
from sqlalchemy import create_engine, Column, Integer
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# ... (엔진, 베이스 클래스, User 클래스 정의) ...
user = User(name='John', age=30)
session.add(user)
session.commit()
user.__dict__['age'] = 31 # SQLAlchemy는 이 변경을 감지하지 못함
session.commit() # 데이터베이스에 변경 사항이 반영되지 않음
반응형
'FastAPI' 카테고리의 다른 글
(SQLAlechemy 보다 편리한) SQLModel + FastAPI 이용 (0) | 2024.12.29 |
---|---|
FastAPI 실시간 대화방 예제 (0) | 2024.12.21 |
FastAPI, Jinja 기본 예제 (2) | 2024.12.18 |
FastAPI, CRUD API 예제 (0) | 2024.12.17 |
FastAPI, 동영상 강좌 FastAPI Beyond CRUD (1) | 2024.12.15 |