in_ python orm sqlalchemy

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



sqlalchemy select (4)

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"}


Dependiendo de su caso de uso (si no necesita validar o inferir nada del modelo), puede guardar una llamada de DB usando 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 , según el tipo de sesión (si usa scoped_session ):

user_query.update(data_to_update, synchronize_session=False)


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)


Sobre la base de 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 acerca de 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


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