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