存在重复条目时,使用 SQLAlchemy/SQLite3 高效插入多行
我使用 SQLAlchemy 将多行插入到 SQLite3 表中,并且这些条目经常已经在表中。一次插入一行非常慢,如果该行已经存在,则捕获异常并继续。有没有有效的方法来做到这一点?如果该行已经存在,我什么也不做。
I'm inserting multiple rows into an SQLite3 table using SQLAlchemy, and frequently the entries are already in the table. It is very slow to insert the rows one at a time, and catch the exception and continue if the row already exists. Is there an efficient way to do this? If the row already exists, I'd like to do nothing.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以使用 SQL 语句
如果插入是重复的, 来简单地忽略该插入。 此处了解
IGNORE
冲突子句也许您可以使用
OR IGNORE
作为 SQLAlchemyInsert
中的前缀
- 有关如何在INSERT< 之间放置
OR IGNORE
的文档/代码> 和SQL 语句中的INTO
为 此处You can use an SQL statement
to simply ignore the insert if it is a duplicate. Learn about the
IGNORE
conflict clause herePerhaps you can use
OR IGNORE
as aprefix
in your SQLAlchemyInsert
-- the documentation for how to placeOR IGNORE
betweenINSERT
andINTO
in your SQL statement is here如果您愿意运行“本机”sqlite SQL,您可以这样做:
但是,这不能在所有 DBMS 之间移植,因此这就是在通用 sqlalchemy 方言中找不到它的原因。
您可以做的另一件事是使用 SQLAlchemy ORM,定义一个“域模型”——一个映射到数据库表的 Python 类。然后,您可以创建域类的许多实例,并对您想要插入(或忽略)的每个项目调用 session.save_or_update(domain_object) ,最后在您想要插入(或忽略)项目时调用 session.commit()到您的数据库表。
这个问题看起来像 SQLAlchemy - INSERT OR REPLACE 等效项的重复
If you are happy to run 'native' sqlite SQL you can just do:
However, this won't be portable across all DBMS's and is therefore the reason that its not found in the general sqlalchemy dialect.
Another thing you could do is use the SQLAlchemy ORM, define a 'domain model' -- a python class which maps to your database table. Then you can create many instances of your domain class and call session.save_or_update(domain_object) on each of the items you wish to insert (or ignore) and finally call session.commit() when you want to insert (or ignore) the items to your database table.
This question looks like a duplicate of SQLAlchemy - INSERT OR REPLACE equivalent