gpt4 book ai didi

python - 将 Python 列表与 SQLite 表进行比较并获得差异

转载 作者:太空宇宙 更新时间:2023-11-03 13:17:16 25 4
gpt4 key购买 nike

是否有基于 SQL 查询的解决方案来将 Python 列表与 SQLite 表进行比较,并仅获取表中不存在的那些项目?

我将项目存储在我的 SQLite 表中,当我的代码运行时,我想只存储那些新的项目并想扩展我的表。

我知道将 SQL 结果作为列表与我的 Python 列表进行比较很容易,但我不想将查询结果加载到内存中,因为我的表包含大量数据,而且我有更多的实例代码同时运行。

最佳答案

是的,你可以这样做......但我认为你不想这样做。您的目标是只插入表中不存在的项目,对吗?所以:

CREATE TABLE Breakfast (id INTEGER PRIMARY KEY AUTOINCREMENT, dish UNIQUE)
INSERT INTO Breakfast (dish) VALUES ('spam')
INSERT INTO Breakfast (dish) VALUES ('eggs')

现在,在 Python 中,打开这个数据库,然后:

>>> breakfast = ['spam', 'eggs', 'baked beans']
>>> db.execute('SELECT * FROM Breakfast').fetchall()
[(1, 'spam'), (2, 'eggs')]
>>> db.executemany('INSERT OR IGNORE INTO Breakfast (dish) VALUES(?)',
[[dish] for dish in breakfast])
>>> db.execute('SELECT * FROM Breakfast').fetchall()
[(1, 'spam'), (2, 'eggs'), (5, 'baked beans')]

如您所见,它为 'baked beans' 插入了一个新行,同时保持两个现有行不变,因为它们已经存在。

参见 ON CONFLICT有关冲突条款如何工作的文档。 (尽管 OR IGNORE 没有拼写为 ON CONFLICT,但它是一个冲突子句。)


请注意,这首先需要有一个可以触发冲突的约束 — 在我的示例中,它是 dish 列上的 UNIQUE。如果您没有这样的约束,则必须手动重现相同的效果(例如,使用可怕、丑陋的子 SELECT)。但几乎总是,正确的答案是添加约束。您的问题陈述隐含地假设该值是键或其他唯一值,或者“表中不存在的项目”真的没有任何意义,因此您的数据模型应该反射(reflect)这一点。

关于python - 将 Python 列表与 SQLite 表进行比较并获得差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25044288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com