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

发布于 2024-11-02 10:57:11 字数 113 浏览 1 评论 0原文

我使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无声情话 2024-11-09 10:57:11

您可以使用 SQL 语句

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

如果插入是重复的, 来简单地忽略该插入。 此处了解 IGNORE 冲突子句

也许您可以使用 OR IGNORE 作为 SQLAlchemy Insert 中的前缀 - 有关如何在 INSERT< 之间放置 OR IGNORE 的文档/代码> 和SQL 语句中的 INTO此处

You can use an SQL statement

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

to simply ignore the insert if it is a duplicate. Learn about the IGNORE conflict clause here

Perhaps you can use OR IGNORE as a prefix in your SQLAlchemy Insert -- the documentation for how to place OR IGNORE between INSERT and INTO in your SQL statement is here

箹锭⒈辈孓 2024-11-09 10:57:11

如果您愿意运行“本机”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 等效项的重复

If you are happy to run 'native' sqlite SQL you can just do:

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文