2017-10-21 3 views
0

Ich bin neu in Python. Ich versuche, zwei SQLite-Datenbanken mit dem gleichen Schema zu vergleichen. Die Tabellenstruktur ist auch in beiden DB identisch, aber die Daten sind unterschiedlich. Ich möchte Pickup die Zeilen aus beiden Tabellen aus beiden Datenbanken, die in nicht vorhanden sind entweder db1.fdetail oder db2.fdetailVergleich zweier SQLite-Datenbanken mit Python

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 

Erwartete Ausgabe

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

Mein Code ist

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

Also hab ich mir zwei Listen res1 und res2. Wie kann ich die Listen anhand der Spalte Keyid vergleichen?

Jede Hilfe wird sehr geschätzt.

Antwort

1

Wenn beide Datenbanken in derselben Verbindung geöffnet werden (die ATTACH erfordert), können Sie den Vergleich in SQL tun:

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

Sie können auch ein einzelnes Ergebnis erhalten, indem die Anfragen mit UNION ALL kombinieren.

+0

Minor nit, aber da der Dateiname in ATTACH ein String-Ausdruck ist, kein Bezeichner, könnten Sie ihn nicht mit Platzhaltern übergeben - im Vergleich zur Verwendung von String-Formatierung. Hier macht sich allerdings kaum etwas aus. –

+0

Vielen Dank für Ihre Hilfe. Es funktionierte. Ich habe ein paar Dinge nicht verstanden. Warum ist es 'main.fdetail' und nicht' db1.fdetail' in der ersten Abfrage –

+0

@ IljaEverilä Ich nahm an, dass der Datenbankname kein Ausdruck war, aber das Testen zeigt, dass es tatsächlich ist. Vielen Dank! –

0

Sie können Ihre Listen in Sätze umwandeln und die verfügbaren Mengenoperationen nach Ihren Wünschen verwenden.

1

Sie können Python verwenden ‚set‘:

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

Die symmetrische Differenz von zwei Sätzen die Menge der Elemente, die in einem von entweder festgelegt sind, aber nicht in beiden.

Oder Sie können über beide Listen iterieren bzw. auf Vorhandensein prüfen oder nicht.

+0

Danke. Ist es möglich, dass die Zeile in der Liste nicht eingeschlossen wird, wenn keyid übereinstimmt. –