最近學(xué)習(xí)《Flask Web開發(fā)》,數(shù)據(jù)庫創(chuàng)建使用以及升級流程總是讓我感到混亂睬塌,因此總結(jié)一下啄枕。
Flask數(shù)據(jù)庫用到兩個庫:Flask-SQLAlchemy和Flask-Migrate
- 使用Flask-SQLAlchemy管理數(shù)據(jù)庫
- 使用Flask-Migrate實現(xiàn)數(shù)據(jù)庫遷移
安裝:
pip install Flask-SQLAlchemy
pip install Flask-Migrate
創(chuàng)建數(shù)據(jù)庫
- 進入python shell
導(dǎo)入dbpython manage.py shell
導(dǎo)入model中User Role模型(這個很重要,要不創(chuàng)建出數(shù)據(jù)庫后會沒有表)from app import db
from app.models import Role,User
- 創(chuàng)建數(shù)據(jù)庫
db.create_all()
執(zhí)行完成之后,會生成一個data.sqlite文件情臭,文件中會生成相應(yīng)的表,如果上步?jīng)]有引入Role,User,這里創(chuàng)建出來文件里會沒有對應(yīng)的表
數(shù)據(jù)庫遷移
第一次使用
- 初始化:
這個命令會在項目下創(chuàng)建 migrations 文件夾,所有遷移腳本都存放其中运提。python manage.py db init
- 創(chuàng)建第一個版本:
檢查migrations\versions,會新建一個版本.py闻葵,檢查里面表格及字段民泵,此時數(shù)據(jù)庫中會自動創(chuàng)建一個alembic_version表格,用于記錄數(shù)據(jù)庫版本信息python manage.py db migrate -m "initial migration"
- 運行升級
會把項目使用的數(shù)據(jù)庫文件槽畔,更新為新的表格栈妆、字段,同時保留數(shù)據(jù)python manage.py db upgrade
數(shù)據(jù)庫更新
- 更新表格的字段 (models.py)
- 再次運行一下
相當(dāng)于commit 更新到/migrate目錄python manage.py db migrate -m "commit"
- 數(shù)據(jù)庫更新
數(shù)據(jù)庫會更新python manage.py db upgrade
數(shù)據(jù)庫字段回滾
獲取 History ID
python manage.py db history
回滾到某個 history
python manage.py db downgrade <history_id>
注意
- 數(shù)據(jù)庫遷移的時候厢钧,如果manage.py里沒有導(dǎo)入Role和User鳞尔,模型對應(yīng)表結(jié)構(gòu),遷移腳本拿不到模型早直,就會刪除數(shù)據(jù)庫里對應(yīng)的表寥假。這地方掉坑里好久。
- 在創(chuàng)建數(shù)據(jù)庫的時候也需要導(dǎo)入模型Role和User
為了避免一直重復(fù)導(dǎo)入霞扬,我們可以做些配置糕韧,讓 Flask-Script 的 shell 命令自動導(dǎo)入特定的對象枫振。
所以我們干脆在manage.py文件里統(tǒng)一代碼處理,減少出錯的可能性:
-
導(dǎo)入相應(yīng)文件:Shell(和python shell相關(guān))萤彩,User, Role數(shù)據(jù)模型
from flask_script import Shell from app.models import User, Role
此時數(shù)據(jù)庫升級的時候就能拿到模型知道表結(jié)構(gòu)了粪滤,可以正常升級了。還可以進一步處理在創(chuàng)建數(shù)據(jù)庫的時候也不需要手動導(dǎo)入:
def make_shell_context(): return dict(app=app, db=db, User=User, Role=Role) manager.add_command('shell', Shell(make_context=make_shell_context))
這樣做了之后創(chuàng)建數(shù)據(jù)庫時不需要這一步:
from app.models import Role,User
導(dǎo)入模型乒疏。
其余不變额衙,不會再導(dǎo)致表丟失的問題