【问题标题】:How can SQLite3 databases be merged?SQLite3 数据库如何合并?
【发布时间】:2018-08-14 11:34:06
【问题描述】:

我有许多想要合并的 SQLite3 数据库文件。例如,考虑由代理脚本生成的数据库文件,如下所示:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import random
import time

import folktales

agent_ID = "f67b809e-c38b-465a-9e93-665ab36668f2"

def main():
    while True:
        folktales.insert_state_dictionary_into_database_table(
            entries    = {
                         "value_1" : random.random(),
                         "agent_ID": agent_ID
                         },
            table_name = "measurements",
            filepath   = "database_1.db"
        )
        time.sleep(5)

if __name__ == "__main__":
    main()

其中一个数据库中的一个表可能如下所示:

我想要一种通用方式(可能是 SQL 命令)来合并所有数据库中的所有单个表(可以有多个表)。该命令必须适用于不同形式的数据库(例如,不能具有表名或字段名)。

【问题讨论】:

  • @Parfait 对不起,我应该很清楚,我并没有期待太多的复杂性。单独合并所有表就可以了,无需重置索引。 UUID4 字段用作每个条目的唯一标识符。
  • 跨数据库的所有表是否保持相同精确的命名列和相同列数?
  • @Parfait 是的。
  • same 表名?如果没有,您是否有 代理脚本 可用于了解表名。

标签: python database merge sqlite


【解决方案1】:

考虑 SQLite 的 ATTACH DATABASE 命令来查询外部数据库,然后遍历附加数据库的每个表以将数据附加到第一个数据库。

具体来说,下面打开第一个数据库,然后迭代地将每个数据库附加到包含 SQLite 数据库的目录中。然后在每个数据库中,查询表名,然后循环附加它们的每个内容。外循环被包装在第一个数据库连接的上下文管理器with() 中,因此无需在最后运行conn.close()

library(os)
library(sqlite3)

mypath = "/path/to/sqlite/databases"

# OPEN CONNECTION TO FIRST DATABASE
with sqlite3.connect(os.path.join(mypath, "myfirst.db")) as conn:    
    cur = conn.cursor()

    # LOOP THROUGH EACH DB TO ATTACH
    for db in os.listdir(mypath):
        if db != "myfirst.db" and db.endswith(".db"):
            # PASS FULL FILE NAME AS PARAMETER
            cur.execute("ATTACH ? AS curr_db;", os.path.join(mypath, db))

            # GET ALL TABLES IN curr_db
            cur.execute("SELECT name FROM curr_db.sqlite_master WHERE type='table';")
            all_tbls = cur.fetchall()

            # LOOP THROUGH EACH TABLE
            for tbl in all_tbls:
                # APPEND DATA (ASSUMING SAME COLUMNS IN SAME POSITION)
                sql = "INSERT INTO mytable SELECT * FROM curr_db.[{}];".format(tbl[0])
                cur.execute(sql)
                conn.commit() 

            cur.execute("DETACH curr_db;")

    cur.close()

请务必更新 mypathmyfirstdbmytable 以获取实际名称。如果一切运行正常,第一个数据库的 mytable 将在 all 数据库中的 所有表 中维护 all 记录。您可能需要在循环之前或之后手动将仅第一个数据库中的每个表附加到 mytable 中。

【讨论】:

    猜你喜欢
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2010-12-25
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    相关资源
    最近更新 更多