我在开发环境中使用了一个带有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跟踪更改?
答案 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架构相匹配,并且您也将拥有完整的迁移历史记录。