如何合并许多SQLite数据库?

Dav*_*idM 64 database sqlite

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

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

dfr*_*kow 65

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

attach 'c:\test\b.db3' as toMerge;           
BEGIN; 
insert into AuditRecords select * from toMerge.AuditRecords; 
COMMIT; 
detach toMerge;
Run Code Online (Sandbox Code Playgroud)

根据需要重复.

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

  • 并且'在提交之后'分离到梅尔格;`* (6认同)
  • 如何处理 UNIQUE 约束并更新具有相同特定列的行? (3认同)
  • 这只会合并我想的一个表.你如何一次导入多个表,保留他们的外键? (2认同)

Dav*_*idM 18

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


Moh*_*egh 11

这是一个简单的 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[1:]:
        merge_databases(db_files[0], db_file)

if __name__ == '__main__':
    batch_merge('/directory/to/database/files')
Run Code Online (Sandbox Code Playgroud)

  • 对于 db_files[1:] 中的 db_file: (3认同)

Dam*_*ere 9

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

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

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

  • 对于数百个文件来说这不是一个好的解决方案......这就是我们使用编程技能的原因! (4认同)
  • @GuillermoOlmedo 我的回答的焦点非常明确,即_GUI we go_。我故意加入了这句话。请注意这一点。 (2认同)

Esp*_*spo 1

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

  • 您有执行此操作的代码示例吗? (5认同)