使用WHERE在SQLAlchemy Core中批量更新

时间:2014-09-05 21:29:33

标签: python orm sqlalchemy

我已经设法使用SQLAlchemy中的批量插入,如:

conn.execute(addresses.insert(), [ 
   {'user_id': 1, 'email_address' : 'jack@yahoo.com'},
   {'user_id': 1, 'email_address' : 'jack@msn.com'},
   {'user_id': 2, 'email_address' : 'www@www.org'},
   {'user_id': 2, 'email_address' : 'wendy@aol.com'},
])

我现在需要的是等同于更新的东西。我试过这个:

conn.execute(addresses.insert(), [ 
   {'user_id': 1, 'email_address' : 'jack@yahoo.com', 'id':12},
   {'user_id': 1, 'email_address' : 'jack@msn.com', 'id':13},
   {'user_id': 2, 'email_address' : 'www@www.org', 'id':14},
   {'user_id': 2, 'email_address' : 'wendy@aol.com', 'id':15},
])

期望每一行都根据' id'进行更新。领域,但它不起作用。我假设这是因为我没有指定WHERE子句,但我不知道如何使用字典中包含的数据指定WHERE子句。

有人能帮助我吗?

3 个答案:

答案 0 :(得分:46)

阅读文档的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' : 'jack@yahoo.com', '_id':1},
    {'user_id': 1, 'email_address' : 'jack@msn.com', '_id':2},
    {'user_id': 2, 'email_address' : 'www@www.org', '_id':3},
    {'user_id': 2, 'email_address' : 'wendy@aol.com', '_id':4},
])

答案 1 :(得分:7)

Flask Session具有名为bulk_insert_mappingsbulk_update_mappings的功能。检查here

请注意,您必须在映射中提供主键

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

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

答案 2 :(得分:2)

@Jongbin Park的解决方案DID使用复合主键为我工作。 (Azure SQL Server)。

update_vals = []
update_vals.append(dict(Name='name_a', StartDate='2020-05-26 20:17:32', EndDate='2020-05-26 20:46:03', Comment='TEST COMMENT 1'))
update_vals.append(dict(Name='name_b', StartDate='2020-05-26 21:31:16', EndDate='2020-05-26 21:38:37', Comment='TEST COMMENT 2'))
s.bulk_update_mappings(MyTable, update_vals)
s.commit()

其中Name,StartDate和EndDate都是复合pk的一部分。 “注释”是要在数据库中更新的值