如何在单个查询中检查数据库中是否已存在主键列表?

时间:2017-09-27 06:54:49

标签: python postgresql sqlalchemy

在db中,我有一个名为register的表,它有mail-id作为主键。我曾经使用session.add_all()批量提交。但有时候一些记录已经存在;在这种情况下,我想分离已存在的记录和不存在的记录。

2 个答案:

答案 0 :(得分:2)

http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.merge

如果要添加到数据库的所有对象都已完成(例如,新对象至少包含数据库中记录的所有信息),则可以使用Session.merge()。有效merge()将创建或更新现有行(通过查找主键(如果它存在于会话/数据库中并从您合并的对象复制状态)。需要注意的关键是,传递给merge的对象的属性值将覆盖数据库中已存在的属性值。

我认为这在性能方面并不是那么好,所以如果这很重要,SQLAlchemy有一些批量操作。您需要检查将要添加/更新的主键集的存在性,并为不存在的对象执行一次批量插入,并对已执行的对象执行一次批量更新。如果需要采用高性能方法,文档中有一些关于批量操作的信息。

http://docs.sqlalchemy.org/en/latest/orm/persistence_techniques.html#bulk-operations

答案 1 :(得分:-1)

用户SQL ALchemys检查器:

inspector = inspect(engine)
inspector.get_primary_keys(table, schema)

Inspector“反映”所有主键,您可以检查返回的列表。