最近在使用flask寫個小平臺,遇到一個flask migrate無法創(chuàng)建遷移腳本的問題,記錄下邪狞。
正常我們使用flask-migrate時统阿,步驟是:
python manage.py db init #初始化,工程目錄下生成一個migrations文件夾
python mange.py db migrate
python manage.py db upgrade
需要確認(rèn)你之前的操作步驟為以上三步。(初始化為三個步驟岂昭,之后的遷移只需要執(zhí)行后兩個步驟)
我在models.py里面開始創(chuàng)建了幾個模型,但后面由于另外一個問題“mysql字符編碼的問題導(dǎo)致我一個加密數(shù)據(jù)字段寫不進(jìn)數(shù)據(jù)庫”狠怨,解決方法里面“修改mysql的字符編碼格式對已經(jīng)創(chuàng)建的表是不生效的 ”,所以就把DB里面的表全部刪掉了邑遏。重啟mysql服務(wù)后佣赖,接下來我就需要執(zhí)行這兩個 migrate, upgrade 遷移步驟。但真是特別尷尬的记盒,不報錯憎蛤,DB也不生成表。
執(zhí)行遷移的兩個命令是下面這樣子的纪吮。
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的時候冰肴,數(shù)據(jù)庫中在創(chuàng)建table的同時屈藐,也創(chuàng)建了一張alembic_version表,這個表里面只有一個version_sum字段熙尉,它記錄的版本號联逻,和我們init命令在工程下生成的 migrations下面的versions的一個py文件是一樣的。
由于我們刪掉表的時候检痰,沒有把這個自己生成的alembic_version表刪掉包归,我們只刪掉工程下面migrations的時候,init不會有問題铅歼,但在遷移的時候公壤,它檢測數(shù)據(jù)庫里面有個版本號,就不會去創(chuàng)建表了椎椰。
最終境钟,刪掉數(shù)據(jù)庫里面的alembic_version表,刪掉工程下生成的 migrations文件目錄俭识。
執(zhí)行下面三個命令慨削。
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