WedX - журнал о программировании и компьютерных науках

Миграция Flask для нескольких баз данных

Чтобы немного рассказать о нашем приложении, мы уже настроили базу данных для существующих конечных точек в приложении. Теперь появилось новое требование добавлять конечные точки в одно и то же приложение, обращающееся к другой базе данных. Как указано в документации 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.

То, что мы пробовали до сих пор,

  1. Удалил папку миграции.
  2. Повторно запустите цикл инициализации-миграции-обновления.
  3. Убедитесь, что все версии перегонного куба синхронизированы (таблица перегонного куба в обеих базах данных, голова в репо).
  4. Мы также попытались выполнить миграцию одной БД, и это сработало. Почему-то кажется, что при переносе нескольких БД возникает проблема.

ИСХОДНАЯ КОНФИГУРАЦИЯ (одна БД):

# 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 в обеих БД корректно обновляются с правильным номером версии миграции. Но после этого, когда мы вносим какие-либо изменения в модель и требуется выполнить вторую миграцию, новый файл миграции не создается и выдает ошибку «Целевая база данных не найдена».

Цените помощь!


Ответы:


1

У меня тоже была такая же проблема. Моя проблема была решена, когда я применил одну базу данных, используя SQLALCHEMY_DATABASE_URI, и другую, используя SQLALCHEMY_BINDS, а затем удалил миграции и таблицы (не подтверждать удаление таблицы необходимо или нет). Затем он отлично собирал все миграции без ошибки Error: Target database is not up to date. Мой предыдущий код:

SQLALCHEMY_BINDS = {
        'central': POST_CONN_URI % POSTGRES_MAIN_DB_NAME,
        'tenant': POST_CONN_URI % 'demo_tenant'
    }

и новый код:

SQLALCHEMY_DATABASE_URI = POST_CONN_URI % POSTGRES_MAIN_DB_NAME
SQLALCHEMY_BINDS = {
   'tenant': POST_CONN_URI % 'demo_tenant'
}
20.11.2020
Новые материалы

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


Для любых предложений по сайту: [email protected]