我有许多希望合并的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命令)来合并所有数据库中的所有单独表(可以有多个表)。该命令必须适用于不同形式的数据库(例如,不能使用表名或字段名)。
发布于 2018-08-14 18:35:14
考虑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()确保更新mypath、myfirstdb和mytable以获取实际名称。如果一切正常运行,第一个数据库的mytable将维护所有数据库中所有表的所有记录。您可能需要在循环之前或之后手动将第一个数据库中的每个表添加到mytable中。
https://stackoverflow.com/questions/51840455
复制相似问题