2017-10-21 19 views
0

私はPythonの新機能です。私は、同じスキーマを持つ2つのsqliteデータベースを比較しようとしています。テーブル構造も両方のdbで同じですが、データは異なります。私はピックアップのいずれかdb1.fdetailまたはdb2.fdetailPythonを使用した2つの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 

私のコードは、だから私は二つのリストres1res2を持っている

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

です。列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

軽度ですが、ATTACHのファイル名は識別子ではなく文字列式なので、文字列の書式設定と比較して、プレースホルダを使用して渡すことはできません。しかし、ここではほとんど違いはありません。 –

+0

ご協力いただきありがとうございます。出来た。私は物事のカップルを理解していない。なぜ最初のクエリで 'main.fdetail'で' db1.fdetail'でないのですか? –

+0

@IljaEveriläデータベース名が式ではないと仮定しましたが、テストでは実際にそれが示されています。ありがとう! –

0

リストをセットに変換して、使用可能なセット操作を使用して目的に合わせることができます。

1

あなたのpythonを使用することができますが「セット」:

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

二組の対称差がなくともに、いずれかのセットの1つである要素の集合です。

または、両方のリストを繰り返し処理して、存在するかどうかを確認できます。

+0

ありがとうございました。 keyidが一致すれば、donotはリストにその行を含めることが可能ですか? –

関連する問題