首先让我首先说我对sql有点新鲜(但是已经做了很长时间的python)。我一直无法在网上找到解决问题的好方法。
问题:
我有一个未定义的数字(尽管可能少于100)我需要查询和合并结果的相同结构的sqlite数据库。数据库本身并不是特别大。
我一直在查看ATTACH命令,并按照本教程中的内容进行操作: http://souptonuts.sourceforge.net/readme_sqlite_tutorial.html
import sqlite3 as lite
Database = "library.db"
con = lite.connect(Database)
con.row_factory = lite.Row
cur = con.cursor()
cur.execute("ATTACH DATABASE 'library.db' As 'db1'")
cur.execute("ATTACH DATABASE 'library2.db' As 'db2'")
cur.execute("""
SELECT 'db1',* FROM db1.table
UNION
SELECT 'db2',* FROM db2.table
""")
但似乎应该有一种比在execute命令中明确拼写出每个数据库更好的方法。此外,看起来我可以附加到的数据库数量有限制吗? https://sqlite.org/limits.html
我也看过类似将它们合并到一个大型数据库中的内容: How can I merge many SQLite databases? 但是每次需要进行查询或者许多单个数据库中的一个发生变化时,将数据库合并在一起似乎效率低下。
在我继续走下去的路上之前,我想知道是否有更好的方法可以解决我不知道的这类事情?
有关该项目的其他潜在有用信息:
答案 0 :(得分:0)
您可以使用视图来避免拼写出每个查询中的所有数据库:
CREATE VIEW MyTable_all AS
SELECT 'db1', db1.* FROM db1.MyTable
UNION ALL
SELECT 'db2', db2.* FROM db1.MyTable
...
但是,如果数据库太多,则无法使用ATTACH。 在这种情况下,您必须将所有数据库合并在一起。
如果所有数据库每次都这样做太慢,您可以通过保留每条记录的来源同时同步单个数据库:
DELETE FROM MyTable WHERE SourceDB = 1;
INSERT INTO MyTable SELECT 1, * FROM db1.MyTable;