Создание «нулевого состояния» миграции для существующей базы данных с помощью sqlalchemy / alembic и «фиктивная» нулевая миграция для этой существующей базы данных - PullRequest
0 голосов
/ 31 августа 2018

Я хочу добавить alembic в существующий проект sqlalchemy с использованием работающей производственной базы данных. Я не могу найти стандартный способ выполнить «нулевую» миграцию == миграция, настраивающая БД в том виде, в каком она есть сейчас (для новых разработчиков, настраивающих свою среду)

В настоящее время я добавил импорт декларативного базового класса и всех моделей, использующих его, в env.py, но впервые alembic -c alembic.dev.ini revision --autogenerate создает существующие таблицы.

И мне нужно «подделать» миграцию на существующие установки - используя код. Для django ORM я знаю, как это сделать, но мне не удается найти правильный способ сделать это с помощью sqlalchemy / alembic

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

alembic revision --autogenerate проверяет состояние подключенной базы данных и состояние цели metadata, а затем создает миграцию, которая приводит database в соответствие с metadata.

Если вы вводите alembic/sqlalchemy в существующую базу данных и хотите, чтобы файл миграции, в котором пустая свежая база данных воспроизводила текущее состояние, выполните следующие действия.

1) Убедитесь, что ваш metadata действительно соответствует вашему текущему database. Запуск alembic revision --autogenerate создает миграцию с нулевыми операциями.

2) Создайте новый temp_db пустой и укажите ваш sqlalchemy.url в alembic.ini на этот новый temp_db.

3) Выполнить alembic revision --autogenerate. Это создаст желаемую массовую миграцию, которая приведёт в соответствие новую базу данных с текущей.

4) Удалите temp_db и повторно укажите sqlalchemy.url в существующей базе данных.

5) Выполнить alembic stamp head. Это сообщает sqlalchemy, что текущая миграция представляет состояние базы данных, поэтому при следующем запуске alembic upgrade head она начнется с этой миграции.

0 голосов
/ 31 августа 2018

Новая установка: применение миграции

Просто запустите alembic upgrade head для пустой базы данных. Это применит все миграции (в вашем случае, первоначальную миграцию, поскольку она единственную) к базе данных.

Если вы хотите сделать это из кода, а не из оболочки, вы можете сделать это следующим образом:

from alembic.config import Config
from alembic import command
alembic_cfg = Config("/path/to/yourapp/alembic.ini")
command.upgrade(alembic_cfg, "head")

Существующая установка: фальсификация миграции

SQL-способ

Один из способов запустить этот SQL для базы данных:

CREATE TABLE IF NOT EXISTS alembic_version (
    version_num VARCHAR(32) NOT NULL
);

INSERT INTO alembic_version (version_num) VALUES ('your initial migration version');

Первый оператор создает таблицу, которую использует alembic для отслеживания вашей базы данных / состояния миграции. Второе утверждение в основном сообщает alembic, что состояние вашей базы данных соответствует версии вашей первоначальной миграции или, другими словами, подделывает миграцию.

Alembic way

У Alembic есть команда stamp, которая в основном делает то же самое. Его можно вызвать из оболочки как alembic stamp head или из кода (взятого из поваренная книга ):

from alembic.config import Config
from alembic import command
alembic_cfg = Config("/path/to/yourapp/alembic.ini")
command.stamp(alembic_cfg, "head")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...