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