FullStack学习笔记——Flask Migrate操作步骤

先进行安装:

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

这样运行就没有问题了。

 


当然了,我遇到问题的是发生在删除了原来的文件(因为代码参数弄错了又不知道从哪里修改起),重新写代码和重新迁移出现了问题。

  • 遇到"ERROR [root] Error: Target database is not up to date."这样的错误,该怎么办?

  1. 查看Migrate的状态;
    python xxx.py(xxx为文件名) db heads

     

  2. 查看当前状态;
    python xxx.py db current

     

  3. 解决用stamp head
     python xxx.py db stamp head

     

  • 遇到"ERROR [root] Error: Can't locate revision identified by '3df14427c4d0'"怎么办?

           多半是因为数据库版本不对,可能是更换了 migrations 文件,但是仍旧使用的是原来的数据库表,数据库冲突。

  • 遇到"INFO  [alembic.env] No changes in schema detected."怎么办?

        因为“自动创建的迁移会根据模型定义和数据库当前之间的差异生成upgrade()和downgrade()函数的内容”。

  • 遇到"INFO  [alembic.runtime.migration] Will assume transactional DDL."

原因五花八门,有说是”flask数据库迁移,只有一个版本表,没有生成其他表”,有说“没有导入数据库模型类,例如User和Role,因此没被flask-migrate侦测到。”

 

总的来说,有关迁移的工作其实是alembic在负责的,报错的原因也显示了是alembic做出的反馈。擒贼先擒王,找到了问题的根源就好解决了。无论如何,从alembic下手是没错的。

Mac下解决方案:(参考了大神的文章:https://segmentfault.com/a/1190000006949536

  1. 打开terminal,在当前的目录下:
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就不太会报错了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值