Перенос данных между базами
Не структура таблицы, а сами записи — как их переносят между базами и почему перенос обязательно проверяют.
Второе значение слова «миграция» — перенос данных между базами или системами: например, из старой базы в новую, из одного формата хранения в другой. Не путайте с миграцией схемы из раздела 22.27 — там менялась структура таблицы, здесь переезжают сами записи.
JSON (раздел 22.15) удобен как промежуточный формат в этом процессе — он текстовый, человекочитаемый и его легко прочитать в любом языке программирования. Но JSON — не универсальный формат переноса без потерь: у него нет отдельного типа для дат, для двоичных данных, и он не хранит ограничения и связи между таблицами (внешние ключи, раздел 22.21) — их приходится восстанавливать отдельно на стороне целевой базы.
Маленький воспроизводимый пример
import json
import sqlite3
istochnik = sqlite3.connect("zadachi.db")
istochnik.row_factory = sqlite3.Row
stroki = istochnik.execute("SELECT title, done FROM tasks").fetchall()
dannye = [dict(stroka) for stroka in stroki]
with open("zadachi.json", "w", encoding="utf-8") as fajl:
json.dump(dannye, fajl, ensure_ascii=False, indent=2)
import json
import sqlite3
with open("zadachi.json", encoding="utf-8") as fajl:
dannye = json.load(fajl)
cel = sqlite3.connect("novaya_zadachi.db")
cel.execute("CREATE TABLE tasks (id INTEGER PRIMARY KEY, title TEXT NOT NULL, done INTEGER NOT NULL DEFAULT 0)")
for zapis in dannye:
cel.execute(
"INSERT INTO tasks (title, done) VALUES (?, ?)",
(zapis["title"], zapis["done"]),
)
cel.commit()
id при вставке — старые идентификаторы не переносятся. Это осознанный выбор, не случайность: если приложению важно сохранить исходные id (например, на них ссылаются извне), их нужно переносить явно и после этого проверить, что они остались уникальными. Любой перенос данных должен заканчиваться проверкой: совпадает ли количество строк и совпадают ли представительные записи в источнике и в цели.Перенос между локальными файлами SQLite в этом примере воспроизводит тот же принцип, что и перенос в промышленную базу вроде PostgreSQL, — читать, преобразовывать, записывать, проверять. Отличаются только конкретные инструменты и драйверы подключения; сначала — обязательная резервная копия исходных данных.