如果我有大量的SQLite数据库,所有数据库都具有相同的架构,那么将它们合并在一起以便对所有数据库执行查询的最佳方法是什么?
Answers:
总结一下DavidM的答案中的Nabble帖子:
attach 'c:\test\b.db3' as toMerge;           
BEGIN; 
insert into AuditRecords select * from toMerge.AuditRecords; 
COMMIT; 
detach toMerge;
根据需要重复。
注意:detach toMerge;根据麦克的评论添加。
可以按需完成此操作,一天可能执行几次。我将看到它的工作方式如http://sqlite.1065341.n5.nabble.com/Attempting-to-merge-large-databases-td39548.html,其中数据库被合并到一个大型数据库中,执行查询然后删除大型数据库。
尽管线程很旧,但这仍然是当今编程需求中的一个相关问题。我将其发布在这里是因为所提供的答案均不简洁,简单且直接。这是为了最终出现在此页面上的Google员工。GUI我们去:
Ctrl + O键盘快捷键添加所有数据库文件Copy,然后转到已加载的数据库文件列表中的目标数据库(或根据需要创建一个新文件),然后右键单击目标数据库并单击Paste我很惊讶地意识到,使用古老的编程技巧:复制粘贴:)可以解决这样艰巨的任务
如果只需要执行一次合并操作(以创建新的更大的数据库),则可以创建一个脚本/程序,该脚本/程序将循环所有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()
SRC: 合并相同的SQLite3数据库的工具
如果您已到达此提要的底部但仍未找到解决方案,则这也是一种合并2个或更多sqlite数据库表的方法。
首先尝试下载并安装sqlite数据库的数据库浏览器。然后尝试在2个窗口中打开数据库,然后尝试通过简单地将表从一个拖放到另一个来合并它们。但是问题在于您一次只能拖放一个表,因此,它并不是专门针对此答案的解决方案,但是如果您的数据库很小,它可以用来节省进一步搜索的时间。
在没有冒犯的情况下,就像一个开发人员到另一个开发人员一样,我担心您的想法似乎效率很低。在我看来,您可能应该在同一个数据库文件中存储多个表,而不是合并SQLite数据库。
但是,如果我弄错了,我想您可以附加数据库,然后使用VIEW简化查询。或制作一个内存表并复制所有数据(但这在性能上更差,特别是如果您有大型数据库)
detach toMerge;之后。