flask migrate無法建立遷移指令碼的問題
最近在使用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 dbmigrate INFO[alembic.runtime.migration] Context impl SQL/">MySQLImpl. INFO[alembic.runtime.migration] Will assume non-transactional DDL. E:\00practice_python\zhileqa20180914>python manage.py dbupgrade 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不會有問題,但在遷移的時候,它檢測資料庫裡面有個版本號,就不會去建立表了。

工程migrations檔案目錄

mysql db table
最終,刪掉資料庫裡面的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 dbmigrate 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 dbupgrade 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