Глава 22 · Веб-разработка с Python

Перенос данных между базами

Не структура таблицы, а сами записи — как их переносят между базами и почему перенос обязательно проверяют.

Второе значение слова «миграция» — перенос данных между базами или системами: например, из старой базы в новую, из одного формата хранения в другой. Не путайте с миграцией схемы из раздела 22.27 — там менялась структура таблицы, здесь переезжают сами записи.

Исходная база
читаем строки
Python
преобразуем данные
JSON
промежуточный файл (необязательно)
Целевая база
записываем строки
Проверка
сверяем количество и содержимое
Перенос данных: чтение, преобразование, запись, проверка

JSON (раздел 22.15) удобен как промежуточный формат в этом процессе — он текстовый, человекочитаемый и его легко прочитать в любом языке программирования. Но JSON — не универсальный формат переноса без потерь: у него нет отдельного типа для дат, для двоичных данных, и он не хранит ограничения и связи между таблицами (внешние ключи, раздел 22.21) — их приходится восстанавливать отдельно на стороне целевой базы.

Маленький воспроизводимый пример

eksport_v_json.py
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_iz_json.py
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, — читать, преобразовывать, записывать, проверять. Отличаются только конкретные инструменты и драйверы подключения; сначала — обязательная резервная копия исходных данных.

Практика: перенос данных через JSON
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →