En SQLAlchemy, ¿cómo interactúa el método de actualización de dict con el ORM?

Así que tuve una tabla SQLAlchemy con una columna JSON:

from sqlalchemy.dialects.postgresql import JSON class MyTable(db.Model): id = db.Column(db.Integer, primary_key=True) my_json_column = db.Column(JSON) 

Y traté de actualizar la columna con el método de dict#update así:

 def foo(my_object, new_params): my_object.my_json_column.update(new_params) db.session.commit() 

Sin embargo, eso no funcionó. Edit: Lo que quise decir es que las actualizaciones no se estaban guardando en la base de datos.

Lo que funcionó fue esto:

 def foo(my_object, new_params): temp_params = my_object.my_json_column.copy() temp_params.update(new_params) my_object.my_json_column = new_params db.session.commit() 

Sospecho que tiene algo que ver con la “inmutabilidad” o que el ORM solo nota cambios en la asignación directa, o algo así. ¿Alguien sabe exactamente por qué?

Sí. Por defecto, SQLAlchemy no rastrea los cambios dentro de los atributos de dict . Para hacer un seguimiento de los cambios, puede utilizar la extensión mutable :

 class MyTable(db.Model): ... my_json_column = db.Column(MutableDict.as_mutable(JSON))