4

我有烧瓶迁移(版本 1.8.0)在开发环境中与 sqlite 数据库配合良好。现在我想将我们的数据迁移到 MySQL 并维护我们所有的迁移历史(因此它与我们的 git 存储库中的 Flask-SQLAlchemy 模型保持同步)。

我创建了一个空的 MySQL 数据库,在更改了我的 SQLALCHEMY_DATABASE_URI 之后,我尝试运行:

python manage.py db upgrade

这导致无法删除表 migrate_version 的错误。(这是有道理的,因为这是一个新数据库,尽管 sqlite 实际上包含表 'alembic_version' 而不是 'migrate_version'。)

所以,我尝试初始化这个新数据库:

python manage.py db init

现在我收到一个错误:“目录迁移已经存在”。

我可以重命名该文件夹并毫无问题地重新运行该命令,但随后我丢失了所有以前的迁移。我认为当我们也过渡到我们的测试和生产环境时,我们也会遇到同样的问题。

我在文档中看到 Flask-Migrate 有多个数据库支持,但我认为这看起来更适合在单个开发环境中维护多个数据库。有没有办法让 Flask-Migrate 跨多个开发环境跟踪更改?

4

4 回答 4

6

要解决 OP 问题中的真正问题,您需要使用该--directory标志来启动特定于每个环境数据库的迁移目录。

从烧瓶迁移文档:

所有命令还带有一个 --directory DIRECTORY 选项,该选项指向包含迁移脚本的目录。如果省略此参数,则使用的目录是迁移。

所以:

flask db init --directory=[DIRECTORY NAME]

Flask-Migrate 本身没有你的数据库内存,所以当使用 运行迁移命令时flask db,它会引用指定的迁移目录(默认情况下,当--directory不使用标志时,这称为“迁移”)。

flask db migrate --directory=[DIRECTORY_NAME]

等等

不用说,flask 命令将引用配置文件或环境变量配置的应用程序上下文。

我通常为每个环境创建一个迁移目录,并明确引用该环境:例如开发和登台,使用“migrations_dev”和“migrations_stg”之类的东西。

希望这会有所帮助。

于 2019-06-29T09:01:43.293 回答
2

以下是我从 SQLite 过渡到 MySQL 并维护所有迁移历史的步骤。我高度怀疑有更好的方法来做到这一点,但它对我有用。

使用另一个文件夹为您的“新”迁移初始化新的空白数据库

python manage.py db init -d tmp

创建迁移

python manage.py db migrate -d tmp -m "Bring MySQL up to date"

应用迁移

python maange.py db upgrade -d tmp

现在,您可以删除“tmp”迁移文件夹。你不再需要它了。找到 HEAD 迁移。寻找'Rev:your_revision_num(head)'

python manage.py db show 

对 MySQL 数据库运行更新语句

update alembic_version set version_num = 'your_revision_num'

现在,您的 MySQL 数据库架构应该与您的旧 SQLite 架构匹配,并且您还将拥有完整的迁移历史记录。

于 2016-03-28T13:20:21.933 回答
0

我也有同样的需求。我想重现 laravel 框架中存在的命令,以便在不同的环境中进行迁移:

php artisan migrate --env prod

使用这种命令,您可以在不同的环境中启动迁移。我没有在烧瓶中找到直接等效的命令。

“flask db upgrade --env prod”命令不存在。特别是 --env 参数。

作为一种解决方法,我创建了一个允许我更改环境的命令:

flask env --name prod

该命令是一个自定义烧瓶命令,它将 .env.prod 文件的内容复制到 .env。

这样,应用程序就处于 prod 环境中。然后我们可以在 prod 环境中启动迁移命令。

如何使用自定义的 env 命令迁移到不同的环境?

要在暂存环境中开始迁移,只需运行以下两个命令:

flask env --name staging
flask db updgrade

然后,如果您想在生产环境中开始迁移,只需运行以下两个命令:

flask env --name prod
flask db updgrade

如何创建自定义命令烧瓶环境?

首先,您需要知道如何在烧瓶中创建自定义命令。只需遵循官方的 falsk 文档即可

这是我的自定义命令的内容,它允许更改环境:

from flask.cli import with_appcontext
import shutil


@click.command('env')
@click.option("--name", is_flag=False, flag_value="Flag", default="")
@with_appcontext
def env(name):
    if name == '':
        print(os.getenv('FLASK_ENV'))
        return

    if name not in ['dev', 'prod', 'local', 'staging']:
        print('That env does not exist')
        return

    shutil.copyfile('.env.' + name, '.env')

    return

在我的设置中,我有 4 个环境:local、dev、staging、prod。

我有 4 个对应的 .env 文件:.env.local、.env.staging、.env.prod、.env.dev

自定义烧瓶 env 命令还将环境文件的内容复制到烧瓶应用程序在启动时加载的 .env 文件中。

于 2022-02-11T10:57:02.197 回答
0

该表migrate_version用于按包跟踪迁移sqlalchemy-migrate。如您所知,Flask-Migrate 使用的包 Alembic 使用alembic_version表格。

所以我的猜测是,您要使用的这个 MySQL 数据库之前已被 sqlalchemy-migrate 控制下的应用程序使用过。

我建议您删除 MySQL 数据库并创建一个全新的数据库。

于 2016-03-25T16:06:50.043 回答