建立和部署flask中資料庫遷移versions中無版本
背景:
我是一開始沒有使用migrate這個功能,後來學到《Flask web開發》第八章後覺得不能遷移資料庫太不方便了,就想回來學習下flask-migrate的使用
問題:
但是這時候我的hello.py已經使用藍本分離成manage.py了,關於資料庫的資訊位於models.py裡面,若是直接像書上一樣
先輸入python manage.py db init建立遷移倉庫,顯示的還正常:
Creating directory C:\Users\kai\PycharmProjects\practice\myflasky\migrations ... done
Creating directory C:\Users\kai\PycharmProjects\practice\myflasky\migrations\versions ... done
Generating C:\Users\kai\PycharmProjects\practice\myflasky\migrations\alembic.ini ... done
Generating C:\Users\kai\PycharmProjects\practice\myflasky\migrations\env.py ... done
Generating C:\Users\kai\PycharmProjects\practice\myflasky\migrations\README ... done
Generating C:\Users\kai\PycharmProjects\practice\myflasky\migrations\script.py.mako ... done
Please edit configuration/connection/logging settings in 'C:\\Users\\kai\\PycharmProjects\\practice\\myflasky\\migrations\\alembic.ini' before proceeding.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
但是之後再輸入python manage.py db upgrade建立遷移指令碼後,就不對了:
(base) C:\Users\kai\PycharmProjects\practice\myflasky>python manage.py db migrate -m "initial migration"
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.env] No changes in schema detected.
- 1
- 2
- 3
- 4
缺少
Detected added table 'roles'
Detected added table 'users'
這兩行,進入migrations資料夾中的versions發現的確是空的,證明建立指令碼失敗
求解過程:
先是在網上查了一圈,參考了mrchi和杜志鵬的回答,瞭解到應該是flask-migrate沒有偵測到我的db資料導致的,但是我的manage.py中是有
from app import create_app, db
from app.models import User, Role
和
def make_shell_context():
return dict(app=current_app, db=db, User=User, Role=Role, Permission=Permission)
manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command('db', MigrateCommand)
- 1
- 2
- 3
- 4
- 5
借鑑杜志鵬的評論,嘗試cd到app中使用python models.py db migrate -m “initial migration”不過直接報錯了。
接著參考mrchi的問題中的描述,我在cmd中輸入命令前輸python manage.py shell進入互動,再輸入
from app import db
from app.models import User, Role
- 1
- 2
來匯入模型,在輸入建立指令碼指令,不過結果還是一樣的。
期間我還在segment上提了問題,但是結果也還不是很滿意
最終解決辦法
在經歷前面的折騰,想到我的程式碼和操作應該是沒有問題的,只可能是一些前提錯了,於是我就想到了
INFO [alembic.env] No changes in schema detected.
- 1
這句話,既然說沒有變化你就不建立,那我就把你(sqlite)刪了,看你還說不說沒有變化,於是。。。
(base) C:\Users\kai\PycharmProjects\practice\myflasky>python manage.py db migrate -m "inital migration"
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected added table 'roles'
INFO [alembic.autogenerate.compare] Detected added index 'ix_roles_default' on '['default']'
INFO [alembic.autogenerate.compare] Detected added table 'users'
INFO [alembic.autogenerate.compare] Detected added index 'ix_users_email' on '['email']'
INFO [alembic.autogenerate.compare] Detected added index 'ix_users_username' on '['username']'
Generating C:\Users\kai\PycharmProjects\practice\myflasky\migrations\versions\c08a64ca29fc_inital_migration.py ... done
(base) C:\Users\kai\PycharmProjects\practice\myflasky>python manage.py db upgrade
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> c08a64ca29fc, inital migration
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
成功了!
不過頓時覺得自己像個逗比。。。
按照這個方法可以成功,不過資料庫中資料會消失,建議先建立遷移資料庫,再寫入資料。