base sulla risposta di @ Martijn-Pieters, è possibile non solo colonna di aggiornamento dinamico con setattr
, ma anche in grado di utilizzare tabella dinamica e la colonna si combinano con getattr
e setattr
esempio:
# 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()
BTW , è possibile ottenere maggiori informazioni su setattr
, getattr
, hasattr
in pitone ufficiale doc 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
questo è un set con un get, forse un po 'lento? – chao787
@RichardWong: L'ORM deve almeno verificare che la voce esista e dare all'oggetto la possibilità di interferire con i dati (potrebbero esserci proprietà ibride, ecc.). Ovviamente potresti creare la tua istruzione 'UPDATE' con SQLAlchemy core. –
@RichardWong: ma considera che la sessione è abbastanza sofisticata negli aggiornamenti di memorizzazione nella cache e di tracciamento. Se si sceglie di bypassare, è necessario assicurarsi di invalidare anche la cache della sessione. –