Cómo actualizar sqlalchemy orm object por un dict de python

los nombres clave del dict están asignados a los atributos del objeto sqlalchemy

ex:

class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) fullname = Column(String) password = Column(String) 

se puede actualizar desde id = 3, {name: "diana"} o id = 15, {name: "marchel", fullname: "richie marchel"}

Puede usar setattr() para actualizar los atributos en un objeto SQLAlchemy existente dinámicamente:

 user = session.query(User).get(someid) for key, value in yourdict.iteritems(): setattr(user, key, value) 

Tengo otra solución aquí. Sería útil definir el método del modelo de la siguiente manera.

 class ModelName(db.Model): """ docstring here """ ... def update(self, **kwargs): for key, value in kwargs.items(): setattr(self, key, value) 

Espero que resuelva tu problema.

Gracias

Dependiendo de su caso de uso (si no necesita validar o inferir nada del modelo), puede guardar una llamada de base de filter_by utilizando filter_by con id para obtener una fila específica y actualizarla usando un diccionario como inicialmente deseaba.

 user_query = session.query(User).filter_by(id=someid) data_to_update = dict(name="marchel", fullname="richie marchel") user_query.update(data_to_update) 

Es posible que también deba agregar el argumento synchronize_session=False keyword a su llamada de update , dependiendo del tipo de sesión (si usa scoped_session ):

 user_query.update(data_to_update, synchronize_session=False) 

En base a la respuesta de @ martijn-pieters, no solo puede actualizar dinámicamente la columna con setattr , sino que también puede usar la tabla dinámica y la columna combinadas con getattr y setattr

ejemplo:

 # models.py class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) fullname = Column(String) password = Column(String) # update.py import models def dynamic_update(dynamic_table, col_id, dynamic_cols): """ dynamic_table: name of the table, "User" for example col_id: id of which column you want to update dynamic_cols: key value pairs {name: "diana"} """ if hasattr(models, dynamic_table): table = getattr(models, dynamic_table) col_info = table.query.filter_by(id=col_id).first() for (key, value) in dynamic_cols.items(): if hasattr(table, key): setattr(col_info, key, value) session.commit() 

Por cierto, puede obtener más información sobre setattr , getattr , hasattr en el documento oficial de python https://docs.python.org/2/library/functions.html#setattr

https://docs.python.org/2/library/functions.html#getattr

https://docs.python.org/2/library/functions.html#hasattr