2014-09-05 93 views
12

我設法在SQLAlchemy中與批量插入工作,如:批量更新使用WHERE

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]'}, 
]) 

我現在需要的是等價的東西進行更新。我試過這個:

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}, 
]) 

期望每行根據'id'字段進行更新,但它不起作用。我認爲這是因爲我沒有指定WHERE子句,但我不知道如何使用字典中包含的數據指定WHERE子句。

有人可以幫我嗎?

回答

24

閱讀Inserts, Updates and Deletes部分的文檔。下面的代碼應該讓你開始:

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

主鍵怎麼樣刀片也依賴於幾種選擇? – Aidis 2017-07-05 11:54:29

+0

'update()缺少1個需要的位置參數:'values'',這個例子中的地址是什麼? – 2017-09-06 11:32:02

+2

@HeddevanderHeide:''Table']的實例中的'addresses'(http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table) – van 2017-09-06 13:43:37

5

瓶會話函數調用bulk_insert_mappingsbulk_update_mappings。檢查here

請注意,您必須提供映射

# 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()