如何合并许多SQLite数据库?

时间:2008-09-17 07:28:45

标签: database sqlite

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

我知道可以使用ATTACH来执行此操作,但它有32个和64个数据库的a limit,具体取决于计算机上的内存系统。

8 个答案:

答案 0 :(得分:62)

总结DavidM的答案中的Nabble post

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

根据需要重复。

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

答案 1 :(得分:18)

这可以按需完成,可能一天几次。我认为它工作的方式与http://sqlite.1065341.n5.nabble.com/Attempting-to-merge-large-databases-td39548.html一样,数据库合并到一个大型数据库中,执行查询,然后删除大型数据库。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

最新答案,但您可以使用:

Junit

SRC:Tool to merge identical SQLite3 databases

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

这是一个简单的python代码,用于合并两个数据库文件或扫描目录以查找所有数据库文件并将它们合并在一起(只需将其他文件中的所有数据插入找到的第一个数据库文件):

import sqlite3
import os


def merge_databases(db1, db2):
    con3 = sqlite3.connect(db1)

    con3.execute("ATTACH '" + db2 +  "' as dba")

    con3.execute("BEGIN")
    for row in con3.execute("SELECT * FROM dba.sqlite_master WHERE type='table'"):
        combine = "INSERT OR IGNORE INTO "+ row[1] + " SELECT * FROM dba." + row[1]
        print(combine)
        con3.execute(combine)
    con3.commit()
    con3.execute("detach database dba")


def read_files(directory):
    fname = []
    for root,d_names,f_names in os.walk(directory):
        for f in f_names:
            c_name = os.path.join(root, f)
            filename, file_extension = os.path.splitext(c_name)
            if (file_extension == '.sqlitedb'):
                fname.append(c_name)

    return fname

def batch_merge(directory):
    db_files = read_files(directory)
    for db_file in db_files:
        merge_databases(db_files[0], db_file)

if __name__ == '__main__':
    batch_merge('/directory/to/database/files')

答案 7 :(得分:-5)

没有冒犯,就像一个开发者和另一个开发者一样,我担心你的想法看起来非常低效。 在我看来,您可能应该在同一个数据库文件中存储多个表,而不是联合SQLite数据库。

但是,如果我错了,我猜你可以安装数据库,然后使用VIEW来简化你的查询。或者制作一个内存表并复制所有数据(但是性能更差,特别是如果你有大型数据库)