2017-02-18 2 views
1

Ich habe eine Tabelle mit Benutzerdaten, und ich möchte Informationen für viele Benutzer mit einer Liste von Wörterbüchern aktualisieren. Im Moment benutze ich eine for-Schleife, um eine Update-Anweisung ein Wörterbuch nach dem anderen zu senden, aber es ist langsam und ich hoffe, dass es eine Bulk-Methode dafür gibt.SQLAlchemy - Tabelle mit der Liste der Wörterbücher aktualisieren

user_data = [{'user_id' : '12345', 'user_name' : 'John'}, {'user_id' : '11223', 'user_name' : 'Andy'}] 

connection = engine.connect() 
metadata = MetaData() 

for row in user_data: 
     stmt = update(users_table).where(users_table.columns.user_id == row['user_id']) 
     results = connection.execute(stmt, row) 

Vielen Dank im Voraus!

Antwort

1
from sqlalchemy.sql.expression import bindparam 

connection = engine.connect() 

stmt = users_table.update().\ 
where(users_table.c.id == bindparam('_id')).\ 
values({ 
    'user_id': bindparam('user_id'), 
    'user_name': bindparam('user_name'), 
}) 

connection.execute(stmt, [ 
{'user_id' : '12345', 'user_name' : 'John', '_id': '12345'}, 
{'user_id' : '11223', 'user_name' : 'Andy', '_id': '11223'} 

]) 
+0

Hoffe, das wird helfen! – Gigapalmer

+0

Danke! In diesem Beispiel, sollte ich "id" in "user_id" und "_id" zu "user_id" in der WHERE-Anweisung ändern? So wäre es: 'where (users_table.c.user_id == bindparam ('user_id')). Andernfalls bekomme ich:' StatementError: (sqlalchemy.exc.InvalidRequestError) Ein Wert ist erforderlich für Bind Parameter '_id' – Venetian

+0

@ Venezianisch Je nachdem, welche Datenbank Sie verwenden, kann dies die Leistung nicht drastisch verbessern. Sehen Sie sich zum Beispiel [diese Frage] an (http://stackoverflow.com/questions/8134602/psycopg2-insert-multiple-rows-with-one-query) (PostgreSQL). – univerio

Verwandte Themen