lynlab logo

blog

about

#development#python

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

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

profile picture

Hoerin Doh | 2018. 11. 05

아래는 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()

관련 포스트

asdf — 하나의 명령어로 관리하는 버전 매니저 썸네일

asdf — 하나의 명령어로 관리하는 버전 매니저

요즘 세상에 하나의 언어로 모든 시스템을 개발하는 경우는 보기 드뭅니다. asdf는 각각의 개발 환경을 플러그인 형식으로 만들어 하나의 명령어로 관리하기 위해 탄생했습니다.

Keybase와 GPG 키를 이용해 Git 커밋에 서명하기 썸네일

Keybase와 GPG 키를 이용해 Git 커밋에 서명하기

Git은 커밋한 사람의 이메일 주소를 검증하지 않습니다. 하지만 GPG 키를 이용해 커밋에 서명을 남기면 커밋한 사람이 본인임을 증명할 수 있습니다.

[Drone] 인메모리 볼륨을 활용해 CI 속도 향상하기 썸네일

[Drone] 인메모리 볼륨을 활용해 CI 속도 향상하기

데이터 IO 작업으로 인해 CI/CD 프로세스에 병목이 생긴다면, 인메모리 볼륨을 활용해 속도를 크게 향상시킬 수 있습니다.

크리에이티브 커먼즈 라이선스

본 사이트의 저작물은 별도의 언급이 없는 한 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0  국제 라이선스에 따라 이용할 수 있습니다.

© 2011 - 2021 Hoerin Doh, All rights reserved.