78

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

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

4

8 回答 8

95

从DavidM 的回答中的Nabble 帖子中总结:

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

根据需要重复。

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

于 2012-06-18T18:58:38.477 回答
18

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

于 2008-09-17T08:03:39.273 回答
8

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

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

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

于 2018-11-15T06:19:46.053 回答
1

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

于 2008-09-17T07:31:30.490 回答
1

迟到的答案,但您可以使用:

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

于 2020-05-22T11:39:40.107 回答
1

这是一个简单的 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')
于 2021-07-26T08:30:24.243 回答
0

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

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

于 2020-06-29T03:51:02.530 回答
-9

无意冒犯,就像一个开发人员对另一个开发人员一样,恐怕您的想法似乎非常低效。在我看来,您应该将多个表存储在同一个数据库文件中,而不是联合 SQLite 数据库。

但是,如果我弄错了,我猜您可以附加数据库,然后使用 VIEW 来简化您的查询。或者创建一个内存表并复制所有数据(但这在性能方面更糟糕,特别是如果你有大型数据库)

于 2008-09-17T09:33:39.183 回答