碰上要数据库迁移, 就又上了一个插件, Flask-Migrate, 但是我不知道为什么, 我自己照着步骤一步一步的做,
python manage.py db init
去初始化一些文件
python manage.py db migrate -m 'say something'
检测models的变化并生成更新脚本
python manage.py db upgrade
执行更新
但是, 显示道是更新成功了, 然而实际上数据库是并没有更新什么的
真的是一脸的懵逼, 然后就换上了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-Migrate下downgrade
使用的是op.add_column('post', 'up_date')
, 后来看alembic的文档里说sqlite是需要新特性的, 但是讲道理应该这个只是影响了downgrade
, 还是不知道为什么Flask-Migrade的upgrade
也会失败