使用Python比较两个sqlite数据库

时间:2017-10-21 19:56:39

标签: python sqlite

我是Python新手。我试图比较具有相同模式的两个sqlite数据库。两个数据库中的表结构也相同,但数据不同。我想从两个数据库中获取两个表中的行,db2.fdetailDB1 -

中不存在

Table - fdetail

id name key 1 A k1 2 B K2 3 C K3

DB2 -

Table - fdetail

id name keyid 1 A k1 2 D K4 3 E K5 4 F K6

id    name    keyid
1     B       k2
2     C       K3
3     D       K4
4     E       K5
5     F       K6

预期产出

import sqlite3

db1 = r"C:\Users\X\Documents\sqlitedb\db1.db"
db2 = r"C:\Users\X\Documents\sqlitedb\db2.db"

tblCmp = "SELECT * FROM fdetail order by id"

conn1 = sqlite3.connect(db1)
conn2 = sqlite3.connect(db2)

cursor1 = conn1.cursor()
result1 = cursor1.execute(tblCmp)
res1 = result1.fetchall()

cursor2 = conn2.cursor()
result2 = cursor2.execute(tblCmp)
res2 = result2.fetchall()

我的代码是

res1

所以我有两个列表res2Keyid。如何根据列module.exports = { view: function(vnode){ // form built here } } 比较列表。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

如果两个数据库都在同一个连接中打开(需要ATTACH),您可以在SQL中进行比较:

import sqlite3

db1 = r"C:\Users\X\Documents\sqlitedb\db1.db"
db2 = r"C:\Users\X\Documents\sqlitedb\db2.db"

conn = sqlite3.connect(db1)
conn.execute("ATTACH ? AS db2", [db2])

res1 = conn.execute("""SELECT * FROM main.fdetail
                       WHERE keyid NOT IN
                         (SELECT keyid FROM db2.fdetail)
                    """).fetchall()
res2 = conn.execute("""SELECT * FROM db2.fdetail
                       WHERE keyid NOT IN
                         (SELECT keyid FROM main.fdetail)
                    """).fetchall()

您还可以通过将查询与UNION ALL相结合来获得单个结果。

答案 1 :(得分:1)

你可以使用python'set':

res1 = set(res1)
res2 = set(res2)
result = res1.symmetric_difference(res2)
  

两组的对称差异是一组元素,它们在任一组中,但不在两者中。

或者您可以分别遍历两个列表,检查是否存在。

答案 2 :(得分:0)

您可以将列表转换为集合,并将可用的集合操作用于您的意图。