如何合并许多SQLite数据库?


73

如果我有大量的SQLite数据库,所有数据库都具有相同的架构,那么将它们合并在一起以便对所有数据库执行查询的最佳方法是什么?

我知道这是可能的使用连网要做到这一点,但它有一个限制的根据机器上的存储系统上的32级64的数据库。

Answers:


84

总结一下DavidM的答案中的Nabble帖子

attach 'c:\test\b.db3' as toMerge;           
BEGIN; 
insert into AuditRecords select * from toMerge.AuditRecords; 
COMMIT; 
detach toMerge;

根据需要重复。

注意:detach toMerge;根据麦克的评论添加。


6
以及提交detach toMerge; 之后
mike 2015年

2
我想这只会合并一张表。您如何一次导入多个表并保留它们的外键?
ILoveCoding 2015年

我试过了,但是由于某种原因,附加数据库中的列未对齐,结果是错误的。因此,我必须在INSERT和SELECT语句中以相同顺序显式声明列名。
Pimin Konstantin Kefaloukos

3
如何应对UNIQUE约束并更新具有相同特定列的行?
秘银

1
@ user5359531我会用其他某种语言(例如python)编写一些东西,以发出执行上述操作的SQL命令,获取SQL,运行SQL。
dfrankow


5

尽管线程很旧,但这仍然是当今编程需求中的一个相关问题。我将其发布在这里是因为所提供的答案均不简洁,简单且直接。这是为了最终出现在此页面上的Google员工。GUI我们去:

  1. 下载Sqlitestudio
  2. 使用Ctrl + O键盘快捷键添加所有数据库文件
  3. 双击每个现在加载的数据库文件以打开/激活/扩展它们全部
  4. 有趣的部分:只需右键单击每个表,然后单击Copy,然后转到已加载的数据库文件列表中的目标数据库(或根据需要创建一个新文件),然后右键单击目标数据库并单击Paste

我很惊讶地意识到,使用古老的编程技巧:复制粘贴:)可以解决这样艰巨的任务


1
我刚刚尝试过,它说对象已经存在,并输入一个新的唯一名称?
J. Scott Elblein '19

1
对于数百个文件而言,这不是一个好的解决方案……这就是为什么我们要使用编程技巧!
Guillermo Olmedo

2
@GuillermoOlmedo我的回答的重点很明确,即GUI我们去了。我故意添加了这个短语。请注意。
Damilola Olowookere

1

如果只需要执行一次合并操作(以创建新的更大的数据库),则可以创建一个脚本/程序,该脚本/程序将循环所有sqlite数据库,然后将数据插入到主(大)数据库中。


3
您有执行此操作的代码示例吗?
user5359531

0

答案较晚,但您可以使用:

#!/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数据库的工具


0

如果您已到达此提要的底部但仍未找到解决方案,则这也是一种合并2个或更多sqlite数据库表的方法。

首先尝试下载并安装sqlite数据库的数据库浏览器。然后尝试在2个窗口中打开数据库,然后尝试通过简单地表从一个拖放到另一个来合并它们。但是问题在于您一次只能拖放一个表,因此,它并不是专门针对此答案的解决方案,但是如果您的数据库很小,它可以用来节省进一步搜索的时间。


-8

在没有冒犯的情况下,就像一个开发人员到另一个开发人员一样,我担心您的想法似乎效率很低。在我看来,您可能应该在同一个数据库文件中存储多个表,而不是合并SQLite数据库。

但是,如果我弄错了,我想您可以附加数据库,然后使用VIEW简化查询。或制作一个内存表并复制所有数据(但这在性能上更差,特别是如果您有大型数据库)


1
当数据库工程师使用不同的副本时,合并两个数据库很有用,以便以某些方式修改结构或内容,同时用户正在修改较旧的实时版本。
Beejor 2015年

我很高兴收到这样的反馈,但这更适合于对原始问题的评论,而不是“答案”。
Elle Fie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.