Объедините несколько одинаковых баз данных sqlite3 с разными именами - PullRequest
0 голосов
/ 18 октября 2019

У меня есть скрипт на 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 Ответ

1 голос
/ 18 октября 2019

Вы всегда можете передать строковый путь в качестве параметра 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() или pathlib.Path.glob().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...