반응형
JSON 필드에 대한 업데이트가 DB에 지속되지 않음
사용자 플래그가 삽입되는 JSON 필드가 있는 모델이 있습니다.삽입은 예상대로 작동하지만 특정 플래그를 제거할 때 플래그는 필드에 남아 변경 내용이 DB에 유지되지 않습니다.
모델에는 다음과 같은 방법이 있습니다.
def del_flag(self, key):
if self.user_flags is None or not key in self.user_flags:
return False
else:
del self.user_flags[key]
db.session.commit()
return True
데이터베이스는 postgres이며 필드 유형에는 SQLalchemy JSON 필드 언어를 사용합니다.조언 좀 해주시겠어요?
Postgres < 9.4 를 사용하고 있는 경우는, JSON 필드를 직접 갱신할 수 없습니다.SQL Chemy에 변경을 보고하려면 flag_modified 함수가 필요합니다.
from sqlalchemy.orm.attributes import flag_modified
model.data['key'] = 'New value'
flag_modified(model, "data")
session.add(model)
session.commit()
저는 JSON 필드를 사용하고 있으며 아래 문서를 참조했습니다.
https://docs.sqlalchemy.org/en/13/core/type_basics.html?highlight=json#sqlalchemy.types.JSON
JSON-dict 필드를 가변으로 하는 방법을 보여 줍니다(기본값은 불변).
이렇게...
from sqlalchemy.ext.mutable import MutableDict
from sqlalchemy import Column, Integer, JSON
class TableABC(Base):
__tablename__ = 'table_abc'
id = Column(Integer, primary_key=True)
info = Column(MutableDict.as_mutable(JSON))
그러면 Json 필드를 ORM으로 업데이트할 수 있습니다.
새로운 행을 작성할 때 SQL Chemy에서 반환된 행 개체를 참조하는 문제가 있었습니다.예를 들어 다음과 같이 동작하지 않습니다.
row = db.session.query(SomeTable).filter_by(id=someId).first()
print(row.details)
newDetails = row.details
newDetails['key'] = 'new data'
row.details = newDetails
db.session.commit()
그러나 새로운 dict를 만드는 것은 효과가 있다.
row = db.session.query(SomeTable).filter_by(id=someId).first()
print(row.details)
newDetails = dict(row.details)
newDetails['key'] = 'new data'
row.details = newDetails
db.session.commit()
공지dict(row.details)
언급URL : https://stackoverflow.com/questions/42559434/updates-to-json-field-dont-persist-to-db
반응형
'programing' 카테고리의 다른 글
Woocommerce에서 쿠폰을 프로그래밍 방식으로 적용합니다. (0) | 2023.02.26 |
---|---|
동기 http 콜(angular)JS (0) | 2023.02.26 |
Wordpress - 학습되지 않은 구문 오류:예기치 않은 토큰 < (0) | 2023.02.26 |
MongoDB: 필드가 null인지 설정되지 않은지에 대한 레코드를 조회하려면 어떻게 해야 합니까? (0) | 2023.02.26 |
gson을 사용한 Java 날짜 UTC (0) | 2023.02.26 |