Использование Flask-migrate для моделей в нескольких файлах - PullRequest
0 голосов
/ 17 июня 2019

Я не совсем понимаю, как использовать Flask-Migrate, когда у меня несколько моделей. В основном мое приложение Flask выглядит так:

app
├── __init__.py
├── config.py
├── manage.py
├── migrations
├── models
│   ├── model1.py
│   ├── model2.py
├── resources
├── run.py
└── tests

Я прочитал , что для каждой модели лучше всего создать объект db = SQLAlchemy() в файле и затем импортировать этот объект БД в __init__.py приложения следующим образом:

from models.model1 import db
db.init_app(app)
from models.model2 import db
db.init_app(app)

Однако, если я сделаю это для нескольких файлов моделей, как я могу добавить функциональность переноса Flasks, учитывая, что я могу использовать только объект sql alchemy для создания экземпляров класса перенастройки:

migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)

Было бы лучше в этом случае определить один объект sql alchemy в файле __init__.py и импортировать его во все мои модели?

1 Ответ

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

Вы неправильно прочитали ссылочный текст. Это говорит о чем-то совершенно ином. Это говорит о том, что ваш db объект должен быть отделен от app объекта (и связать два вместе в фабричной функции create_app). Создание нескольких db объектов только усложняет вам задачу.

Все, что нужно, это один db = SQLAlchemy() объект, и все файлы, которые определяют модели, должны быть импортированы. Обычно это делается прямо или косвенно с помощью заводской функции create_app. В любом случае вам необходимо вызвать функцию create_app(), чтобы иметь возможность запустить инструмент командной строки flask db в любом случае .

Далее вам не необходимо создать менеджера либо . Объект Managar является отложенным с того момента, когда проект Flask добавил поддержку самих сценариев. Если вы используете Flask 0.12 или новее, вы не хотите использовать Flask-Script и его менеджер.

Итак, все, что вам нужно, в вашем __init_.py, это:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate


db = SQLAlchemy()


def create_app(test_config=None):
    app = Flask(__name__)

    app.config.from_object(f"{__name__}.config")
    app.config.from_envvar("PROJECTNAME_SETTINGS", silent=True)
    if test_config:
        app.config.from_mapping(test_config)

    db.init_app(app)
    Migrate(app, db)

    # importing the models to make sure they are known to Flask-Migrate
    from models import models1, models2

    # any other registrations; blueprints, template utilities, commands

    return app
...