2014-04-18 12 views
11

nomi chiave del dict sono mappatura per le attrs oggetto sqlalchemyCome aggiornare sqlalchemy oggetto ORM da un dict pitone

es:

class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    fullname = Column(String) 
    password = Column(String) 

può aggiornare da id = 3, {name: "diana"} o id = 15, {name: "marchel", fullname: "richie marchel"}

risposta

22

È possibile utilizzare setattr() per aggiornare attributi su un oggetto esistente SQLAlchemy dinamicamente:

user = session.query(User).get(someid) 

for key, value in yourdict.iteritems(): 
    setattr(user, key, value) 
+0

questo è un set con un get, forse un po 'lento? – chao787

+1

@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. –

+2

@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. –

2

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

+0

non sembra molto utile allora ha già risposto alla domanda forse dovresti spiegare perché è necessario che tu abbia fatto – Gahan

+0

@Gahan ho cercato attraverso la rete, "come aggiornare dinamicamente tabella e tabella sqlalchemy", ma non ho trovato una buona soluzione , e da questo, so come aggiornare una colonna dinamica, e utilizzare il metodo di cui sopra, possiamo aggiornare la tabella sqlalchemy più facilmente, non solo la colonna dinamica, ma anche la tabella dinamica. – vinian

+0

questa è una bella spiegazione, per favore aggiungila alla tua risposta – Gahan

Problemi correlati