Flask-Migrate создает такую ​​же дублирующую миграцию при использовании со схемами postgres

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

Например, если я удалю свои миграции и создаю новую БД, а затем сделаю manage db migrate, а затем manage db upgrade, все будет работать. Если я затем внесу изменения в db.Model таблицу, а затем сделаю manage db migrate, я не получу сообщения об ошибке.

Однако новый сценарий миграции указывает на предыдущий, но не только на разницу, необходимую для перевода базы данных из предыдущего состояния схемы в новое, но и на полную (абсолютную) миграцию, начиная с пустой схемы - например, это будет попробуйте снова создать таблицы с нуля (с изменением), а не только, например, применить изменение к уже созданной схеме. То есть, хотя миграция связана с предыдущей, она не учитывает то, что было применено предыдущей миграцией. Это означает, что их нельзя связать в цепочку, потому что, например, вторая миграция будет пытаться снова создать таблицы, и поэтому manage db upgrade завершится ошибкой при втором вызове.

Мое приложение manage выглядит так:

from flask_migrate import Migrate, MigrateCommand

from src.common.db import db
from src.common.flaskery import global_flask_app, global_flask_manager

app = global_flask_app(__name__)
migrate = Migrate(app, db)
manager = global_flask_manager(__name__)
manager.add_command('db', MigrateCommand)

from src.db.models import *

def main():
    manager.run()

if __name__ == '__main__':
    main()

Аналогично: Flask Migrate с использованием других схем postgres (__table_args__ = { 'schema': 'test_schema']})


person s5s    schedule 01.09.2019    source источник
comment
Какую базу данных вы используете? Случайно Postgres с нестандартными схемами?   -  person Miguel    schedule 02.09.2019
comment
да. Я добавляю op.execute("create schema data") в def upgrade(), а затем op.execute("drop schema data") в разделы def downgrade().   -  person s5s    schedule 02.09.2019


Ответы (1)


Итак, в вашем migrations/env.py вам нужно добавить include_schemas=True в конфигурацию, как показано ниже:

context.configure(connection=connection,
                  target_metadata=target_metadata,
                  process_revision_directives=process_revision_directives,
                  include_schemas=True,
                  **current_app.extensions['migrate'].configure_args)
person s5s    schedule 02.09.2019