SQLAlchemy에서 jsonb/hstore 칼럼 변경사항이 DB에 반영되지 않는 현상

SQLAlchemy에서 Jsonb/hstore 자료형의 변경 사항이 DB에 제대로 반영되지 않을 떄의 해결 방법.

2018. 11. 05. #development #python

아래는 SQLAlchemy를 이용하여, DB에서 특정 row를 불러와 값을 수정하고 저장하는 예제입니다.

item = session.query(Model).filter_by(id=1).first()
item.int_field += 1

session.commit()

위와 같은 형태의 예제 코드는 int, str, datetime 등 기본적인 필드에서는 정상적으로 동작합니다. 하지만 jsonb/hstore 등 복잡한 자료형에서는 값의 변화를 제대로 감지하지 못하는 현상이 있습니다.

이는 아래와 같이 flag_modified 메소드를 이용하여, 명시적으로 특정 필드를 갱신하도록 설정하여 해결합니다. (참조 : SQLAlchemy 공식 문서)

from sqlalchemy.orm.attributes import flag_modified

...

item = session.query(Model).filter_by(id=1).first()
item.jsonb_field = {'key': 'new_value'}

# 아래 코드를 추가합니다. 파라미터로는 갱신할 인스턴스와 필드명을 넘겨줍니다.
flag_modified(item, 'jsonb_field')

session.commit()
크리에이티브 커먼즈 라이선스

이 저작물은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

© 2011 - 2020 Do Hoerin, LYnLab