Чтобы немного рассказать о нашем приложении, мы уже настроили базу данных для существующих конечных точек в приложении. Теперь появилось новое требование добавлять конечные точки в одно и то же приложение, обращающееся к другой базе данных. Как указано в документации flask-sqlalchemy здесь, чтобы Flask-Migrate работал с несколькими базами данных, мы удалили предыдущие миграции, добавили SQLALCHEMY_BINDS
в конфигурацию, добавили bind_key
в модели и использовали следующую команду:
flask db init --multidb
Это успешно создало новую папку миграции с папкой версий. Затем мы использовали следующую команду;
flask db migrate
Это создало новый файл миграции с соответствующим кодом миграции (созданным Alembic автоматически) для создания новых таблиц в новой базе данных, а также добавило таблицу alembic_version
в новую базу данных. Код миграции не был добавлен во вновь созданный файл миграции для старой/существующей базы данных (как и ожидалось), поскольку не было внесено никаких изменений в модель, связанную с этой существующей базой данных. Затем мы продолжили:
flask db upgrade
и все работало как положено. Таблицы были успешно созданы в новой базе данных, и мы смогли взаимодействовать с таблицами с вновь определенными конечными точками.
Теперь появилось еще одно требование — добавить новые столбцы во вновь созданные таблицы во второй базе данных. Итак, мы добавили столбцы в модель и теперь снова пытаемся migrate
, но продолжаем получать следующую ошибку:
INFO [alembic.env] Migrating database <default>
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
ERROR [root] Error: Target database is not up to date.
То, что мы пробовали до сих пор,
- Удалил папку миграции.
- Повторно запустите цикл инициализации-миграции-обновления.
- Убедитесь, что все версии перегонного куба синхронизированы (таблица перегонного куба в обеих базах данных, голова в репо).
- Мы также попытались выполнить миграцию одной БД, и это сработало. Почему-то кажется, что при переносе нескольких БД возникает проблема.
ИСХОДНАЯ КОНФИГУРАЦИЯ (одна БД):
# DB path definition
SQLALCHEMY_DATABASE_URI='full_path_to_db'
# Model
class Table1(db.Model):
#column declarations with datatypes
НОВАЯ КОНФИГУРАЦИЯ (с multidb):
# DB Path definitions (NOT using SQLALCHEMY_DATABASE_URI anymore, using SQLALCHEMY_BINDS instead.)
SQLALCHEMY_BINDS = {
'db1': 'full_path_to_db',
'db2': 'full_path_to_db'
}
# Models
class Table1(db.Model):
__tablename__ = 'table1'
__bind_key__ = 'db1'
#column declarations
class Table2(db.Model):
__tablename__ = 'table2'
__bind_key__ = 'db2'
#column declarations
Но ошибка не устраняется. Я не уверен, что нам здесь не хватает.
Повторюсь, первая/первоначальная миграция (и обновление) работает просто отлично. Таблицы alembic_version в обеих БД корректно обновляются с правильным номером версии миграции. Но после этого, когда мы вносим какие-либо изменения в модель и требуется выполнить вторую миграцию, новый файл миграции не создается и выдает ошибку «Целевая база данных не найдена».
Цените помощь!