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

将Python列表与SQLite表进行比较并获得差异,第1张

概述是否有一个基于SQL查询的解决方案来比较 Python列表和SQLite表,并获取那些表中没有的项目? 我将项目存储在我的SQLite表中,并且当我的代码运行时,我想只存储那些新的并希望扩展我的表的项目. 我知道将SQL结果作为列表与我的Python列表进行比较会很容易但是我不想将查询结果加载到内存中,因为我的表包含大量数据,而且我的代码运行的代码实例更多同一时间. 是的,你可以这样做……但我认为 是否有一个基于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,'eggs'),(5,'baked beans')]

正如您所看到的,它为’烘焙豆’插入了一个新行,同时保留了两个现有行,因为它们已经存在.

有关冲突条款的工作原理,请参阅ON CONFLICT文档. (即使OR IGnorE没有与ON CONFliCT拼写,它也是一个冲突条款.)

请注意,这需要一个可以在第一个位置触发冲突的约束 – 在我的示例中,它就是菜列上的UNIQUE.如果你没有这样的约束,你必须手动重现相同的效果(例如,使用一个可怕的,丑陋的子SELECT).但几乎总是,正确的答案是添加约束.您的问题陈述隐含地假定该值是键或其他唯一的,或者“表中不存在的项”实际上没有任何意义,因此您的数据模型应该反映出来.

总结

以上是内存溢出为你收集整理的将Python列表与SQLite表进行比较并获得差异全部内容,希望文章能够帮你解决将Python列表与SQLite表进行比较并获得差异所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1193163.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存