最近在使用flask写个小平台,遇到一个flask migrate无法创建迁移脚本的问题,记录下。
正常我们使用flask-migrate时,步骤是:
python manage.py db init #初始化,工程目录下生成一个migrations文件夹
python mange.py db migrate
python manage.py db upgrade
需要确认你之前的操作步骤为以上三步。(初始化为三个步骤,之后的迁移只需要执行后两个步骤)
我在models.py里面开始创建了几个模型,但后面由于另外一个问题“mysql字符编码的问题导致我一个加密数据字段写不进数据库”,解决方法里面“修改mysql的字符编码格式对已经创建的表是不生效的 ”,所以就把DB里面的表全部删掉了。重启mysql服务后,接下来我就需要执行这两个 migrate, upgrade 迁移步骤。但真是特别尴尬的,不报错,DB也不生成表。
执行迁移的两个命令是下面这样子的。
E:\00practice_python\zhileqa20180914>python manage.py db migrate
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
E:\00practice_python\zhileqa20180914>python manage.py db upgrade
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
尝试把工程里面的目录migrtions 删掉,从init命令从新开始走一遍,但也还是没有在db里面生成表。
为啥呢?为啥呢?
解决方法:
因为第一次init的时候,数据库中在创建table的同时,也创建了一张alembic_version表,这个表里面只有一个version_sum字段,它记录的版本号,和我们init命令在工程下生成的 migrations下面的versions的一个py文件是一样的。
由于我们删掉表的时候,没有把这个自己生成的alembic_version表删掉,我们只删掉工程下面migrations的时候,init不会有问题,但在迁移的时候,它检测数据库里面有个版本号,就不会去创建表了。
最终,删掉数据库里面的alembic_version表,删掉工程下生成的 migrations文件目录。
执行下面三个命令。
python manage.py db init #初始化,之后生成一个migrations文件夹
python mange.py db migrate
python manage.py db upgrade
问题解决:)
E:\00practice_python\zhileqa20180914>python manage.py db migrate
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [[alembic.autogenerate.compare](http://alembic.autogenerate.compare/)] Detected added table 'user'
INFO [[alembic.autogenerate.compare](http://alembic.autogenerate.compare/)] Detected added table 'question'
INFO [[alembic.autogenerate.compare](http://alembic.autogenerate.compare/)] Detected added table 'comment'
Generating
E:\00practice_python\zhileqa20180914\migrations\versions\d67e41ceca98_.py ... done
E:\00practice_python\zhileqa20180914>python manage.py db upgrade
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> d67e41ceca98, empty message