Метод, который вы использовали, хорош для создания новой базы данных из существующей базы данных с нуля. Лучший способ, которым я могу придумать для обновления вашей базы данных, на самом деле потребует еще немного кода.
- Вам нужно будет определить, какие таблицы находятся в
recent_db
.
- Перебрать список доступных таблиц в
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()