반응형

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() # 데이터베이스에 변경 사항이 반영되지 않음
반응형

+ Recent posts