最近在使用flask寫(xiě)個(gè)小平臺(tái),遇到一個(gè)flask migrate無(wú)法創(chuàng)建遷移腳本的問(wèn)題,記錄下。
正常我們使用flask-migrate時(shí),步驟是:
python manage.py db init #初始化,工程目錄下生成一個(gè)migrations文件夾
python mange.py db migrate
python manage.py db upgrade
需要確認(rèn)你之前的操作步驟為以上三步。(初始化為三個(gè)步驟,之后的遷移只需要執(zhí)行后兩個(gè)步驟)
我在models.py里面開(kāi)始創(chuàng)建了幾個(gè)模型,但后面由于另外一個(gè)問(wèn)題“mysql字符編碼的問(wèn)題導(dǎo)致我一個(gè)加密數(shù)據(jù)字段寫(xiě)不進(jìn)數(shù)據(jù)庫(kù)”,解決方法里面“修改mysql的字符編碼格式對(duì)已經(jīng)創(chuàng)建的表是不生效的 ”,所以就把DB里面的表全部刪掉了。重啟mysql服務(wù)后,接下來(lái)我就需要執(zhí)行這兩個(gè) migrate, upgrade 遷移步驟。但真是特別尷尬的,不報(bào)錯(cuò),DB也不生成表。
執(zhí)行遷移的兩個(gè)命令是下面這樣子的。
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命令從新開(kāi)始走一遍,但也還是沒(méi)有在db里面生成表。
為啥呢?為啥呢?
解決方法:
因?yàn)榈谝淮蝘nit的時(shí)候,數(shù)據(jù)庫(kù)中在創(chuàng)建table的同時(shí),也創(chuàng)建了一張alembic_version表,這個(gè)表里面只有一個(gè)version_sum字段,它記錄的版本號(hào),和我們init命令在工程下生成的 migrations下面的versions的一個(gè)py文件是一樣的。
由于我們刪掉表的時(shí)候,沒(méi)有把這個(gè)自己生成的alembic_version表刪掉,我們只刪掉工程下面migrations的時(shí)候,init不會(huì)有問(wèn)題,但在遷移的時(shí)候,它檢測(cè)數(shù)據(jù)庫(kù)里面有個(gè)版本號(hào),就不會(huì)去創(chuàng)建表了。
最終,刪掉數(shù)據(jù)庫(kù)里面的alembic_version表,刪掉工程下生成的 migrations文件目錄。
執(zhí)行下面三個(gè)命令。
python manage.py db init #初始化,之后生成一個(gè)migrations文件夾
python mange.py db migrate
python manage.py db upgrade
問(wèn)題解決:)
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