Las actualizaciones del campo JSON no persisten en la base de datos

Tenemos un modelo con un campo JSON donde se insertan las marcas de usuario. La inserción funciona como se esperaba, pero al eliminar ciertas marcas, permanecen en el campo y los cambios no se conservan en la base de datos.

Tenemos el siguiente método en nuestro modelo:

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 

La base de datos es postgres y usamos el dialecto de campo JSON de SQLchemy para el tipo de campo. ¿Algún consejo sobre esto?

Related of "Las actualizaciones del campo JSON no persisten en la base de datos"

Si está utilizando Postgres <9.4, no puede actualizar el campo JSON directamente. Necesita la función flag_modified para informar el cambio a SQLAlchemy:

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

Mi problema hacía referencia al objeto de fila devuelto por SQLAlchemy al crear la nueva fila. Por ejemplo, esto no funciona :

 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() 

pero crear un nuevo dictado funciona

 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() 

aviso dict(row.details)