Получение Flask-Migrate для игнорирования представлений SQL, которые отображаются как модели Flask-SQLAlchemy

Я использую Flask-SQLAlchemy для определения своих моделей, а затем использую Flask-Migrate для автоматического создания сценариев миграции для развертывания в базе данных PostgreSQL. Я определил несколько представлений SQL для базы данных, которые я использую в своем приложении, как показано ниже.

Однако Flask-Migrate теперь генерирует файл миграции для представления, так как считает, что это таблица. Как правильно заставить Flask-Migrate / Alembic игнорировать вид во время автогенерации?

SQL View name: vw_SampleView с двумя столбцами: id а также rowcount,

class ViewSampleView(db.Model):
    __tablename__ = 'vw_report_high_level_count'

    info = dict(is_view=True)

    id = db.Column(db.String(), primary_key=True)
    rowcount = db.Column(db.Integer(), nullable=False)

Что означает, что теперь я могу делать запросы следующим образом:

ViewSampleView.query.all()

Я попытался следовать инструкциям на http://alembic.zzzcomputing.com/en/latest/cookbook.html и добавил info = dict(is_view=True) часть моей модели и следующие биты моей env.py файл, но не знаю, куда идти отсюда.

def include_object(object, name, type_, reflected, compare_to):
    """
    Exclude views from Alembic's consideration.
    """

    return not object.info.get('is_view', False)

...

context.configure(url=url,include_object = include_object)

1 ответ

Решение

Я думаю (хотя и не проверял), что вы можете пометить вашу таблицу как представление с __table_args__ атрибут:

class ViewSampleView(db.Model):
    __tablename__ = 'vw_report_high_level_count'
    __table_args__ = {'info': dict(is_view=True)}

id = db.Column(db.String(), primary_key=True)
rowcount = db.Column(db.Integer(), nullable=False)
Другие вопросы по тегам