Обновите базу данных SQlite3 с другой базой данных SQlite3 в Python - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть две базы данных SQlite "archive_db" и "Recent_db" с одинаковыми таблицами. Я хочу обновить содержимое «archive_db» содержимым «Recent_db». Я попробовал:

dbconn_archive = sqlite3.connect(archive_db)
dbconn_recent = sqlite3.connect(recent_db)
query = "".join(line for line in dbconn_recent.iterdump())
dbconn_archive.executescript(query)

но это не работает, поскольку таблицы уже существуют в archive_db.

Так что же является правильным запросом для обновления «archive_db» на «Recent_db»?

1 Ответ

0 голосов
/ 26 апреля 2018

Метод, который вы использовали, хорош для создания новой базы данных из существующей базы данных с нуля. Лучший способ, которым я могу придумать для обновления вашей базы данных, на самом деле потребует еще немного кода.

  1. Вам нужно будет определить, какие таблицы находятся в recent_db.
  2. Перебрать список доступных таблиц в recent_db:
    • Добавить записи от recent_db до archive_db
    • Предполагая, что вы ввели какой-либо тип уникальности для ваших столбцов в archive_db, вы можете перехватить SQLite IntegrityError и просто пропустить записи, которые уже существуют в таблице, на основе условия уникальности

Примечание : Я предполагаю, что все таблицы в recent_db также существуют в archive_db. Если нет, то вам придется выполнить дополнительную проверку для создания новых таблиц в archive_db, но это было бы за рамками этой проблемы. Я также собираюсь предположить, что вы действительно не хотите обновлять таблицу sqlite_sequence, поскольку это внутренняя таблица, используемая для отслеживания ROWID. И, наконец, я предполагаю, что порядок столбцов в ваших recent_db таблицах одинаков для archive_db

import sqlite3

recent_con = sqlite3.connect('recent.db')
archive_con = sqlite3.connect('archive.db')
recent_cur = recent_con.cursor()
archive_cur = archive_con.cursor()

# table query
tbl_q = """
SELECT name
FROM sqlite_master
WHERE type='table'
    AND name != 'sqlite_sequence'
"""

tables = [t[0] for t in recent_cur.execute(tbl_q)]

for table in tables:
    for row in recent_cur.execute("SELECT * FROM {}".format(table)):
        try:
            archive_cur.execute("INSERT INTO {} VALUES ({})".format(table, ','.join('?' * len(row))), row)
        except sqlite3.IntegrityError:
            pass  # skip record since unique constraint failed
    archive_con.commit()  # commit inserts

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