首页 > 解决方案 > 您如何在生产中结合 Fixtures Flask 迁移?

问题描述

我一直在寻找一个教程,可以指导我是否应该组织我的新手 Flask 项目的迁移脚本并让它们运行固定装置以将数据插入数据库。我更喜欢使用纯 SQL 而不是 Python 脚本。

因为我是这里的新手,所以我不确定这是把东西放在那里的首选方式......但我猜 Django 有固定装置,它们可以在测试和生产中使用。

我自己介绍的教程仅包含用于测试的固定装置,因此到目前为止还没有任何指导。

那么,如何在生产环境中将 SQL 固定装置与 Flask 的迁移结合起来呢?

标签: pythonsqlalchemy

解决方案


好吧,我为此做了一个 hack,如果有人从中受益,我会在这里发布。

这个想法是,如果migrations/versions目录中存在与迁移脚本同名但以 .sql 结尾的文件,则该脚本将运行它。

将下面的内容放到脚本创建的文件中manage.py db migrate

文件:app.utils

from functools import wraps
from alembic import op
import sqlalchemy as sa
import inspect


def apply_migrations_update(f):
    @wraps(f)
    def wrap(*args, **kwargs):
        import os 

        retval = f(*args, **kwargs)

        dir_path = inspect.getfile(f)
        sqlfile = dir_path[:-3] + ".sql" 
        if os.path.isfile( sqlfile ): 
            print ("Opening .sql file {}".format(sqlfile))
            with open(sqlfile, 'r') as myfile: 
                s = sa.sql.text( myfile.read() ) 
                op.execute(s) 
            print ("SQL executed.".format(sqlfile))
        else:
            print ("No .sql file found {}".format(sqlfile))

        return retval

    return wrap

和文件版本/*.py

"""a clever message describing schema changes

Revision ID: bc552c19h313
Revises: 
Create Date: 2018-11-29 16:02:37.716660

"""
from alembic import op
import sqlalchemy as sa
from app.utils import apply_migrations_update
#...

@apply_migrations_update
def upgrade():

推荐阅读