2014-09-05 13 views
12

sono riuscito a lavorare con l'inserimento di massa in SQLAlchemy come:aggiornamento di massa in SQLAlchemy core utilizzando DOVE

conn.execute(addresses.insert(), [ 
    {'user_id': 1, 'email_address' : '[email protected]'}, 
    {'user_id': 1, 'email_address' : '[email protected]'}, 
    {'user_id': 2, 'email_address' : '[email protected]'}, 
    {'user_id': 2, 'email_address' : '[email protected]'}, 
]) 

Che cosa ho bisogno ora è qualcosa di equivalente per l'aggiornamento. Ho provato questo:

conn.execute(addresses.insert(), [ 
    {'user_id': 1, 'email_address' : '[email protected]', 'id':12}, 
    {'user_id': 1, 'email_address' : '[email protected]', 'id':13}, 
    {'user_id': 2, 'email_address' : '[email protected]', 'id':14}, 
    {'user_id': 2, 'email_address' : '[email protected]', 'id':15}, 
]) 

in attesa che ogni riga venga aggiornata in base al campo 'id', ma non funziona. Presumo che sia perché non ho specificato una clausola WHERE, ma non so come specificare una clausola WHERE utilizzando i dati che sono inclusi nel dizionario.

Qualcuno può aiutarmi?

risposta

24

Leggi la sezione Inserts, Updates and Deletes della documentazione. A seguito di codice dovrebbe iniziare:

from sqlalchemy.sql.expression import bindparam 
stmt = addresses.update().\ 
    where(addresses.c.id == bindparam('_id')).\ 
    values({ 
     'user_id': bindparam('user_id'), 
     'email_address': bindparam('email_address'), 
    }) 

conn.execute(stmt, [ 
    {'user_id': 1, 'email_address' : '[email protected]', '_id':1}, 
    {'user_id': 1, 'email_address' : '[email protected]', '_id':2}, 
    {'user_id': 2, 'email_address' : '[email protected]', '_id':3}, 
    {'user_id': 2, 'email_address' : '[email protected]', '_id':4}, 
]) 
+0

che dire di inserti che si basa anche su diverse seleziona? – Aidis

+0

'update() mancante 1 argomento posizionale richiesto: 'valori'', quali sono gli indirizzi in questo esempio? –

+2

@HeddevanderHeide: 'indirizzi' in un'istanza di una [' Tabella'] (http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Tabella) – van

5

Flask sessione ha funzione chiamata bulk_insert_mappings e bulk_update_mappings. controllare here.

essere consapevoli del fatto che è necessario fornire la chiave primaria nelle mappature

# List of dictionary including primary key 
user_mappings = [{ 
    'user_id': 1, # This is pk? 
    'email_address': '[email protected]', 
    '_id': 1 
}, ...] 

session.bulk_update_mappings(User, user_mappings) 
session.commit() 
Problemi correlati