Міграція бази даних у проєктах Python — один зі способів спростити роботу. У Python-проєктах, особливо під час роботи з ORM, важливо вміти працювати з міграціями в обидва боки:
- Генерація моделей з наявної бази даних (Якщо вона вже створена в базі даних)
- Оновлення бази даних при змінах у моделях
Допомагають у цьому бібліотеки SQLAlchemy та Alembic.
🔁 1. Qlacodegen генерація моделей з наявної БД
Qlacodegen -інструмент, який зчитує структуру наявної бази даних і генерує відповідні моделі SQLAlchemy
|
1 |
Далі достатньо запустити простий код
|
1 |
де postgresql://user:password@localhost:5432/dbname – шлях до вашої БД, у цьому випадку Postgres
🔄 2. Міграції: автоматично оновлюємо БД за змінами в моделях за допомогою Alembic
Alembic – Alembic — це інструмент для роботи з міграціями в SQLAlchemy
|
1 |
Для початку роботи потрібно ініціалізувати Alembic у папці проєкту
|
1 |
У проєкті з’явиться папка alembic і файл alembic.ini
У alembic.ini вказуємо рядок підключення до БД.
|
1 |
У alembic/env.py додаємо підключення моделей. Де б у вас не ініціалізувався Base, обов’язково імпортуйте його з файлу, де розташовані моделі (інакше alembic не побачить моделі й міграція не вийде)
|
1 |
Тепер, щоб оновити БД після змін у моделях, достатньо запустити
|
1 |
Alembic Alembic порівняє Base.metadata і структуру БД, створить потрібний скрипт і застосує його.
🧩 Підсумок
| Напрям | Інструмент | Команда |
|---|---|---|
| БД → моделі | sqlacodegen |
sqlacodegen URI --outfile=models.py |
| Моделі → БД | alembic + metadata |
alembic revision --autogenerate, потім alembic upgrade head |
❗ Щоб працювати з кількома базами даних, потрібно:
- Створити окрему Alembic-директорію для кожної бази вручну
- Ініціалізувати кожну окремо з різною назвою
Приклад
|
1 |
Це створить дві незалежні папки alembic_admin/ та alembic_user/, кожна зі своїм alembic.ini.
Потім треба відредагувати кожен alembic.ini:
alembic_admin.ini→ рядок підключення до першої БДalembic_user.ini→ рядок підключення до другої БД
І в env.py кожної директорії налаштовуєте свій target_metadata:
