Flask-Migrate 被坑



Flask-Migrate 被坑

碰上要数据库迁移, 就又上了一个插件, Flask-Migrate, 但是我不知道为什么, 我自己照着步骤一步一步的做,

  • python manage.py db init 去初始化一些文件

  • python manage.py db migrate -m 'say something' 检测models的变化并生成更新脚本

  • python manage.py db upgrade 执行更新

但是, 显示道是更新成功了, 然而实际上数据库是并没有更新什么的

换上alembic

真的是一脸的懵逼, 然后就换上了alembic, 虽然好像操作变得复杂了一些, 好多事情都需要自己完成, 但是其实Flask-Migrate只是alembic的一个封装, 操作简便了却没那么灵活了

  • alembic init alembic 也是初始化些东西

  • 需要修改alembic.ini中的

    sqlalchemy.url = driver://user:pass@localhost/dbname

    其中driver和后面的路径都需要做相应的修改

  • alembic revision -m 'initial'只是生成了更新用的脚本, 但是其实里面的字段需要自己去写, 但是好像是可以用自动生成的

  • 然后就是要修改更新脚本了, upgrade函数里

    op.add_column('post', sa.Column('up_date', sa.DateTime(), nullable=True)添加列就这样就可以了

    但是删除列确实需要这样(官方文档里写这是新特性, 但是也是对sqlite需要用到的东西):downgrade函数里

    with op.batch_alter_table('post') as batch_op:
            batch_op.drop_column('up_date')
    
  • alembic upgrade head 然后这样就可以更新数据库了

  • alembic downgrade -1 这样就可以回到上一个版本的数据库了

在用Flask-Migrate的时候就去看了一下它的alembic.ini(对, 没错, 在Flask-Migrate里还是叫alembic.ini), 里面并没有sqlalchemy.url这个字段, 并没有深究Flask-Migrate的具体实现.

也看了一下Flask-Migrate下的version文件夹里自动生成的更新脚本, 两个工具的upgrade是差不多的, 但是Flask-Migratedowngrade使用的是op.add_column('post', 'up_date') , 后来看alembic的文档里说sqlite是需要新特性的, 但是讲道理应该这个只是影响了downgrade, 还是不知道为什么Flask-Migradeupgrade也会失败