Подтвердить что ты не робот

Обновления поля JSON не сохраняются в DB

У нас есть модель с полем JSON, в который вставлены флаги пользователей. Вставка работает должным образом, но при удалении определенных флагов они остаются в поле, и изменения не сохраняются в БД.

В нашей модели есть следующий метод:

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 для типа поля. Любые советы по этому поводу?

4b9b3361

Ответ 1

Если вы используете Postgres <9.4, вы не можете напрямую обновлять поле JSON. Вам нужна функция flag_modified, чтобы сообщить об изменении SQLAlchemy:

from sqlalchemy.orm.attributes import flag_modified
model.data['key'] = 'New value'
flag_modified(model, "data")
session.add(model)
session.commit()

Ответ 2

Моя проблема заключалась в обращении к объекту строки, возвращенному из SQLAlchemy при создании новой строки. например, это не работает:

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)

Ответ 3

Я использую поле 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.