我正在使用SQLAlchemy将多行插入到SQLite3表中,并且这些条目通常已经在表中。一次插入一行非常慢,并捕获异常并在行已存在时继续。有没有一种有效的方法来做到这一点?如果该行已存在,我想什么都不做。
答案 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()到您的数据库表。
的副本