LYnLab

소개블로그취미로그

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

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

2018-11-05#프로그래밍

💡 이 글은 작성된지 1년 이상 지났습니다. 정보글의 경우 최신 내용이 아닐 수 있음에 유의해주세요.

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

관련된 글

Rails와 GitHub Actions에 커버리지 레포트를 달아보자

이 블로그의 CMS이기도 한 Shiori를 대폭 리팩토링하면서 테스트가 얼마나 잘 작성되어있는지 궁금해졌습니다.

Rails Global ID로 전역 객체 식별하기

Global ID는 Rails의 모든 객체를 식별할 수 있는 URI(Uniform Resource Identifier)입니다.

Ruby on WebAssembly: 살짝 맛보기

Ruby 3.2에 추가된 WebAssembly 지원을 간단하게 테스트해봅시다.

작성한 댓글은 giscus를 통해 GitHub Discussion에 저장됩니다.

크리에이티브 커먼즈 라이선스크리에이티브 커먼즈 저작자표시크리에이티브 커먼즈 동일조건변경허락

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

© 2011 - 2024 Hoerin Doh, All rights reserved.

LYnLab 로고About MeGitHubTwitterInstagram