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

标签 python sqlite

是否有基于 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/

相关文章:

Python 逻辑 - 使用 for 循环减少 1 的集合来创建三角形

python - 在 Python 3 中使用 PIL 库中的图像模块时出现属性错误

python - 计算更多的元素,那么它应该是

bash - 尝试将 csv 导入 sqlite 数据库失败并出现错误 - 预期 9 列,但发现 1 - 用 NULL 填充其余部分

python - Python 和 C 中的 SQlite 时间戳差异

python - 神经网络训练有问题。损失不减

android - 我想在我的 Android 应用程序中添加一个添加到收藏夹选项

java - SQLite数据库错误新手

android - 在android中的SQLite数据库中插入数组

java - Android 中 0 除以 0 得到 NaN(不是数字)