当存在重复条目时,使用SQLAlchemy / SQLite3高效插入多行

时间:2011-04-20 22:58:18

标签: python sqlite sqlalchemy

我正在使用SQLAlchemy将多行插入到SQLite3表中,并且这些条目通常已经在表中。一次插入一行非常慢,并捕获异常并在行已存在时继续。有没有一种有效的方法来做到这一点?如果该行已存在,我想什么都不做。

2 个答案:

答案 0 :(得分:5)

您可以使用SQL语句

INSERT OR IGNORE INTO ... etc. ...

如果它是重复的,则简单地忽略插入。了解IGNORE冲突条款here

也许您可以在SQLAlchemy OR IGNORE中使用prefix作为Insert - 有关如何在OR IGNORE和{{1}之间放置INSERT的文档您的SQL语句中的here

答案 1 :(得分:1)

如果您乐意运行“原生”sqlite SQL,您可以这样做:

REPLACE INTO my_table(id, col2, ..) VALUES (1, 'value', ...);
REPLACE INTO my_table(...);
...
COMMIT

然而,这不会在所有DBMS中都是可移植的,因此是在一般sqlalchemy方言中找不到它的原因。

您可以做的另一件事是使用SQLAlchemy ORM,定义一个'域模型' - 一个映射到数据库表的python类。然后,您可以创建域类的许多实例,并在要插入(或忽略)的每个项目上调用session.save_or_update(domain_object),最后在要插入(或忽略)项目时调用session.commit()到您的数据库表。

此问题看起来像是SQLAlchemy - INSERT OR REPLACE equivalent

的副本