2014-09-05 137 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()