すべて同じスキーマを持つ多数の SQLite データベースがある場合、すべてのデータベースに対してクエリを実行するためにそれらをマージする最良の方法は何ですか?
ATTACHを使用してこれを行うことができることはわかっていますが、マシンのメモリ システムに応じて 32 および 64 データベースの制限があります。
DavidM の回答の Nabble の投稿から要約すると、次のようになります。
attach 'c:\test\b.db3' as toMerge;
BEGIN;
insert into AuditRecords select * from toMerge.AuditRecords;
COMMIT;
detach toMerge;
必要に応じて繰り返します。
注:detach toMerge;
マイクのコメントに従って追加されました。
これはオンデマンドで、1 日に数回行うことができます。私がそれが機能する方法は、データベースが大きなDBにマージされ、クエリが実行されるhttp://sqlite.1065341.n5.nabble.com/Attempting-to-merge-large-databases-td39548.htmlのようになりますその後、大規模なデータベースが削除されました。
このマージ操作を 1 回だけ行う必要がある場合 (新しいより大きなデータベースを作成するため)、すべての sqlite データベースをループしてからデータをメイン (大きな) データベースに挿入するスクリプト/プログラムを作成できます。
遅い答えですが、使用できます:
#!/usr/bin/python
import sys, sqlite3
class sqlMerge(object):
"""Basic python script to merge data of 2 !!!IDENTICAL!!!! SQL tables"""
def __init__(self, parent=None):
super(sqlMerge, self).__init__()
self.db_a = None
self.db_b = None
def loadTables(self, file_a, file_b):
self.db_a = sqlite3.connect(file_a)
self.db_b = sqlite3.connect(file_b)
cursor_a = self.db_a.cursor()
cursor_a.execute("SELECT name FROM sqlite_master WHERE type='table';")
table_counter = 0
print("SQL Tables available: \n===================================================\n")
for table_item in cursor_a.fetchall():
current_table = table_item[0]
table_counter += 1
print("-> " + current_table)
print("\n===================================================\n")
if table_counter == 1:
table_to_merge = current_table
else:
table_to_merge = input("Table to Merge: ")
return table_to_merge
def merge(self, table_name):
cursor_a = self.db_a.cursor()
cursor_b = self.db_b.cursor()
new_table_name = table_name + "_new"
try:
cursor_a.execute("CREATE TABLE IF NOT EXISTS " + new_table_name + " AS SELECT * FROM " + table_name)
for row in cursor_b.execute("SELECT * FROM " + table_name):
print(row)
cursor_a.execute("INSERT INTO " + new_table_name + " VALUES" + str(row) +";")
cursor_a.execute("DROP TABLE IF EXISTS " + table_name);
cursor_a.execute("ALTER TABLE " + new_table_name + " RENAME TO " + table_name);
self.db_a.commit()
print("\n\nMerge Successful!\n")
except sqlite3.OperationalError:
print("ERROR!: Merge Failed")
cursor_a.execute("DROP TABLE IF EXISTS " + new_table_name);
finally:
self.db_a.close()
self.db_b.close()
return
def main(self):
print("Please enter name of db file")
file_name_a = input("File Name A:")
file_name_b = input("File Name B:")
table_name = self.loadTables(file_name_a, file_name_b)
self.merge(table_name)
return
if __name__ == '__main__':
app = sqlMerge()
app.main()
悪意はありませんが、ある開発者が別の開発者と同じように、あなたのアイデアはひどく非効率的であるように思われることを残念に思います。SQLite データベースを結合する代わりに、おそらく同じデータベース ファイル内に複数のテーブルを格納する必要があるように思えます。
ただし、私が間違っている場合は、データベースを ATTACH してから VIEW を使用してクエリを簡素化できると思います。または、メモリ内テーブルを作成してすべてのデータをコピーします (ただし、特に大規模なデータベースがある場合は、パフォーマンスがさらに低下します)