如何在多个开发环境中使用Flask-migrate

时间:2016-03-24 19:55:38

标签: python flask-migrate

我在开发环境中使用了一个带有sqlite数据库的flask-migrate(版本1.8.0)。现在我想将我们的数据迁移到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跟踪更改?

3 个答案:

答案 0 :(得分:1)

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

从flask-migrate文档中:

  

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

所以:

flask db init --directory=[DIRECTORY NAME]

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

flask db migrate --directory=[DIRECTORY_NAME]

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

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

希望这会有所帮助。

答案 1 :(得分:0)

migrate_version用于跟踪包sqlalchemy-migrate的迁移。正如您所知,Flamb-Migrate使用的包Alembic使用alembic_version表。

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

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

答案 2 :(得分:0)

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

使用" new"的另一个文件夹初始化新的空白数据库。迁移

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 (头)'

python manage.py db show 

针对MySQL数据库运行更新语句

update alembic_version set version_num = 'your_revision_num'

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