合并多个具有相同名称的sqlite3相同数据库

时间:2019-10-18 13:44:15

标签: python sqlite

我有一个python脚本,每次给出不同名称的数据库时,该脚本都会给目录“解压”。 现在,我想自动合并这些数据库,它们具有确切的布局!

我尝试使用以下代码,但是在这里我需要手动更改输入名称,有没有一种方法可以自动执行此操作,因此无论是两个数据库还是10个数据库都没有关系,只要有确切的布局,就不管女巫的名字!

import sqlite3

con3 = sqlite3.connect("combine.db")

con3.execute("ATTACH 'results_a.db' as dba")

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

1 个答案:

答案 0 :(得分:1)

您始终可以将字符串路径作为SQL参数传递给ATTACH语句:

database_path = "results_a.db"
con3.execute("ATTACH ? as dba", (database_path,))

将此代码与代码一起使用可以列出所有数据库文件;例如,使用glob.glob(),并假设数据库文件都位于同一目录中,并且文件扩展名始终为.db

import os
import glob

directory_with_databases = "/path/to/directory"
databases = glob.glob(os.path.join(directory_with_databases, "*.db"))

for filename in databases:
    con3.execute("ATTACH ? as dba", (filename,))

    # use attached `dba` database

    con3.execute("detach database dba")

请注意,以上假设可以为每个数据库文件重用名称dba。如果您需要同时附加多个数据库,则还必须生成数据库附件名称。

如果您使用pathlib生成路径,则必须首先将Path()实例转换为字符串:

from pathlib import Path

directory_with_databases = Path("/path/to/directory")

for database_path in directory_with_databases.glob("*.db"):
    con3.execute("ATTACH ? as dba", (str(database_path),))

    # use attached `dba` database

    con3.execute("detach database dba")

您始终可以调整glob以包括任意目录,或以递归方式查找所有匹配文件;有关详细信息,请参见glob.glob()pathlib.Path.glob()的文档。