最近在使用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