programing

JSON 필드에 대한 업데이트가 DB에 지속되지 않음

lastmoon 2023. 2. 26. 10:25
반응형

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

반응형