1. 程式人生 > >建立和部署flask中資料庫遷移versions中無版本

建立和部署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

成功了!
不過頓時覺得自己像個逗比。。。

按照這個方法可以成功,不過資料庫中資料會消失,建議先建立遷移資料庫,再寫入資料。