2017-10-21 89 views
0

我是Python新手。我試圖比較具有相同模式的兩個sqlite數據庫。表格結構在兩個數據庫中也是相同的,但數據不同。我想拾取兩個表中從兩個數據庫中不存在在任一db1.fdetaildb2.fdetail使用Python比較兩個sqlite數據庫

DB1 -

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() 

所以我有兩個列表res1res2。如何根據列Keyid來比較列表。

任何幫助,高度讚賞。

回答

1

如果這兩個數據庫在同一個連接(這需要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結合得到一個結果。

+0

Minor nit,但由於ATTACH中的文件名是字符串表達式,而不是標識符,因此您可以不使用佔位符來傳遞它 - 與使用字符串格式相比。儘管這裏幾乎沒有什麼區別。 –

+0

非常感謝您的幫助。有效。我不明白幾件事情。爲什麼它在第一個查詢中是'main.fdetail'而不是'db1.fdetail' –

+0

@IljaEverilä我假設數據庫名稱不是表達式,但測試顯示它實際上是。謝謝! –

0

您可以將您的列表轉換爲集合,並根據您的意圖使用可用的集合操作。

1

可以使用蟒「設置」:

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

兩個集合的對稱差是一組其是在任一組中的一個元素,但不是在兩者。

或者你可以遍歷這兩個列表分別檢查是否存在。

+0

謝謝。是否有可能,如果keyid匹配,則不要在列表中包含該行。 –