先进行安装:
pip install flask-migrate
安装完成以后,如果需要迁移的文件所在的目录下有好几个py的文件,就不能使用flask db init(我的经验之谈,不知道是不是这个道理)。
例如我当前的文件夹:
我要迁移app.py,如果运行flask db init或flask db migrate,都会报错。如图所示:
而目前我没有找到可以直接使用"flask db init"的办法。 但也不是不能够迁移,经过多次搜索,这个问题得以解决。
官方给出的sample代码是这样的:
但如果是我这样操作就会报错。所以我只好经过彦宏,一番操作才能解决这个问题。
画圈的地方是我额外添加之后可以顺利运行的代码。
from flask_migrate import Migrate,migrate,MigrateCommand
from flask_script import Manager
在migrate定义的地方下面加上两行
manager = Manager(app)
manager.add_command('db',MigrateCommand)
以及在代码最后加上:
if __name__ == '__main__':
manager.run()
这样运行就没有问题了。
当然了,我遇到问题的是发生在删除了原来的文件(因为代码参数弄错了又不知道从哪里修改起),重新写代码和重新迁移出现了问题。
python xxx.py(xxx为文件名) db heads
python xxx.py db current
python xxx.py db stamp head
多半是因为数据库版本不对,可能是更换了 migrations 文件,但是仍旧使用的是原来的数据库表,数据库冲突。
因为“自动创建的迁移会根据模型定义和数据库当前之间的差异生成upgrade()和downgrade()函数的内容”。
原因五花八门,有说是”flask数据库迁移,只有一个版本表,没有生成其他表”,有说“没有导入数据库模型类,例如User和Role,因此没被flask-migrate侦测到。”
总的来说,有关迁移的工作其实是alembic在负责的,报错的原因也显示了是alembic做出的反馈。擒贼先擒王,找到了问题的根源就好解决了。无论如何,从alembic下手是没错的。
rm -rf migrations
比如我的目录是:
我就在当前目录下删除了miagrations这个文件夹:
删除完migration之后,初始化:
alembic init YOUR_ALEMBIC_DIR(你所在当前目录的名字)
此时alembic会在目录创建YOUR_ALEMBIC_DIR
目录和alembic.ini
文件:
在进行下一步之前,需要做两件事:
i.配置一下alembic.ini文件。这里无非是将sqlalchemy.url设置一下,按照config['sqlalchemy_database_uri']的部分。
ii.创建一个数据库版本,并新建两个表。
alembic revision -m 'create table'
你将在versions的目录下看到一个带着一长串编号的py文件。比如我的就是:
在upgrade和downgrade函数修改一下:
def upgrade():
op.create_table(
'account',
sa.Column('id',sa.Integer,primary_key=True),
sa.Column('name',sa.String(50),nullable=False),
sa.Column('description',sa.Unicode(200))
)
def downgrade():
op.drop_table('account')
此时我们可以进行python .py db init和python .py db migrate就不太会报错了。