我有一个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")
答案 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()
的文档。