Python的Flask框架中使用Flask-Migrate擴(kuò)展遷移數(shù)據(jù)庫的教程
我們在升級系統(tǒng)的時(shí)候,經(jīng)常碰到需要更新服務(wù)器端數(shù)據(jù)結(jié)構(gòu)等操作,之前的方式是通過手工編寫alter sql腳本處理,經(jīng)常會發(fā)現(xiàn)遺漏,導(dǎo)致程序發(fā)布到服務(wù)器上后無法正常使用。
現(xiàn)在我們可以使用Flask-Migrate插件來解決之,F(xiàn)lask-Migrate插件是基于Alembic,Alembic是由大名鼎鼎的SQLAlchemy作者開發(fā)數(shù)據(jù)遷移工具。
具體操作如下:
1. 安裝Flask-Migrate插件
$ pip install Flask-Migrate
db = SQLAlchemy(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
3. 初始化
$ python app.py db init
使用Flask-Migrate遷移數(shù)據(jù)庫
隨著開發(fā)進(jìn)度不斷向前,你會發(fā)現(xiàn)你的數(shù)據(jù)庫模型需要更改,而當(dāng)這種情況發(fā)生時(shí)需要更新數(shù)據(jù)庫。
Flask-SQLAlchemy只有當(dāng)數(shù)據(jù)庫表不存在了才從模型創(chuàng)建它們,所以更新表的唯一途徑就是銷毀舊的表,當(dāng)然這將導(dǎo)致所有數(shù)據(jù)庫中的數(shù)據(jù)丟失。
有個(gè)更好的解決方案就是使用數(shù)據(jù)庫遷移框架。和源碼版本控制工具跟蹤更改源碼文件一樣,數(shù)據(jù)庫遷移框架跟蹤更改數(shù)據(jù)庫模型,然后將增量變化應(yīng)用到數(shù)據(jù)庫中。
SQLAlchemy的主要開發(fā)人員寫了一個(gè)Alembic遷移框架,但我們不直接使用Alembic,F(xiàn)lask應(yīng)用可以使用Flask-Migrate擴(kuò)展,一個(gè)集成了Flask-Script來提供所有操作命令的輕量級Alembic包。
4. 創(chuàng)建遷移倉庫
首先,F(xiàn)lask-Migrate必須已經(jīng)安裝到虛擬環(huán)境中:
(venv) $ pip install flask-migrate
下面展示擴(kuò)展如何初始化:
from flask.ext.migrate import Migrate, MigrateCommand
# ...
migrate = Migrate(app, db)
manager.add_command('db', MigrateCommand)
為了可以使用數(shù)據(jù)庫遷移命令,F(xiàn)lask-Migrate提供MigrateCommand類來連接Flask-Script的manager對象。在這個(gè)示例中使用db來連接到命令。
在數(shù)據(jù)庫遷移可以維護(hù)之前,必須通過init子命令來創(chuàng)建一個(gè)遷移庫:
(venv) $ python hello.py db init
Creating directory /home/flask/flasky/migrations...done Creating directory /home/flask/flasky/migrations/versions...done Generating /home/flask/flasky/migrations/alembic.ini...done Generating /home/flask/flasky/migrations/env.py...done Generating /home/flask/flasky/migrations/env.pyc...done Generating /home/flask/flasky/migrations/README...done Generating /home/flask/flasky/migrations/script.py.mako...done Please edit configuration/connection/logging settings in '/home/flask/flasky/migrations/alembic.ini' before proceeding.
這個(gè)命令創(chuàng)建一個(gè)migrations文件夾,里面存放了所有遷移腳本。
建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運(yùn)行g(shù)it checkout 5c來切換到這個(gè)版本的應(yīng)用程序。
5. 創(chuàng)建遷移腳本
在Alembic,數(shù)據(jù)庫遷移工作由遷移腳本完成。這個(gè)腳本有兩個(gè)函數(shù),分別叫做upgrade()和downgrade()。upgrade()函數(shù)實(shí)施數(shù)據(jù)庫更改,是遷移的一部分,downgrade()函數(shù)則刪除它們。通過添加和刪除數(shù)據(jù)庫變化的能力,Alembic可以重新配置數(shù)據(jù)庫從歷史記錄中的任何時(shí)間點(diǎn)。
Alembic遷移可以分別使用revision和migrate命令手動或自動創(chuàng)建。手動遷移通過由開發(fā)人員使用Alembic的Operations對象指令實(shí)現(xiàn)的空upgrade()和downgrade()函數(shù)創(chuàng)建遷移框架腳本。另一方面,自動遷移通過尋找模型定義和數(shù)據(jù)庫當(dāng)前狀態(tài)間的不同為upgrade()和downgrade()生成代碼。
警告:自動遷移并不總是準(zhǔn)確的,可以忽略一些細(xì)節(jié)。所以應(yīng)該經(jīng)常審查一下自動生成的遷移腳本。
migrate子命令創(chuàng)建自動遷移腳本:
(venv) $ python hello.py db migrate -m "initial migration"
INFO [alembic.migration] Context impl SQLiteImpl. INFO [alembic.migration] Will assume non-transactional DDL. INFO [alembic.autogenerate] Detected added table 'roles' INFO [alembic.autogenerate] Detected added table 'users' INFO [alembic.autogenerate.compare] Detected added index 'ix_users_username' on '['username']' Generating /home/flask/flasky/migrations/versions/1bc 594146bb5_initial_migration.py...done
建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運(yùn)行g(shù)it checkout 5c來切換到這個(gè)版本的應(yīng)用程序。注意,你不需要為這個(gè)應(yīng)用生成migrations,所有的遷移腳本都包含在版本庫中。
6. 更新數(shù)據(jù)庫
一旦遷移腳本被審查且接受,就可以使用db upgrade命令更新到數(shù)據(jù)庫中:
(venv) $ python hello.py db upgrade
INFO [alembic.migration] Context impl SQLiteImpl. INFO [alembic.migration] Will assume non-transactional DDL. INFO [alembic.migration] Running upgrade None -> 1bc594146bb5, initial migration
第一次遷移實(shí)際上相當(dāng)于調(diào)用db.create_all(),但在后續(xù)遷移中,upgrade命令對表實(shí)施更新操作但不影響表中的內(nèi)容。
相關(guān)文章
python編寫函數(shù)注意事項(xiàng)總結(jié)
在本篇文章里小編給大家分享了一篇關(guān)于python編寫函數(shù)注意事項(xiàng)總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2021-03-03
Python實(shí)現(xiàn)報(bào)警信息實(shí)時(shí)發(fā)送至郵箱功能(實(shí)例代碼)
這篇文章主要介紹了Python實(shí)現(xiàn)報(bào)警信息實(shí)時(shí)發(fā)送至郵箱,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
pygame學(xué)習(xí)筆記之設(shè)置字體及顯示中文
游戲界面中文字也是非常常見的元素之一,pygame專門提供了Font模塊來支持文字的顯示,下面這篇文章主要給大家介紹了關(guān)于pygame學(xué)習(xí)筆記之設(shè)置字體及顯示中文的相關(guān)資料,需要的朋友可以參考下2022-07-07
python實(shí)現(xiàn)二維數(shù)組的對角線遍歷
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)二維數(shù)組的對角線遍歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
Python操作使用MySQL數(shù)據(jù)庫的實(shí)例代碼
本篇文章主要介紹了Python 操作 MySQL的實(shí)例代碼,詳細(xì)介紹了Python如何連接數(shù)據(jù)庫和對數(shù)據(jù)的增刪查改,有興趣的可以了解一下2017-05-05
對Python中GIL(全局解釋器鎖)的一點(diǎn)理解淺析
首先需要明確的一點(diǎn)是GIL并不是Python的特性,它是在實(shí)現(xiàn)Python解析器(CPython)時(shí)所引入的一個(gè)概念,下面這篇文章主要給大家介紹了關(guān)于對Python中GIL的一點(diǎn)理解,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05

