Flask09 資料庫遷移

2021-09-24 02:26:01 字數 4084 閱讀 4507

我們在開發軟體的時候往往會有這樣的情況,資料庫裡面的表不是一下子全部鍵好的,往往是隨著開發功能的增加,會不斷的增加新錶,新的字段,而我們之前也講了清空表的語句drop_all,建立表的語句creat_all,我們好像可以通過這兩個語句對錶進行更改,新增新的字段,新的表。

但是,大家有沒有想過乙個問題,我們每次要新增新的字段的時候都要將表資料全部清空,這就意味著我們要刪除之前的資料,再重新建立表結構,再重新插入新的資料,當然如果是在我們的開發測試階段,這種操作姑且還是可以接受的,而當我們的產品正式上線執行了,我們又不得不加入新的字段呢?這個時候清空表?恐怕是不能被接受的吧。

所以我們就需要有乙個工具來幫我們在不影響原有表結構和資料的情況下,增加欄位到表當中,或者增加新錶。而這個工具就是我們的資料庫遷移工具migrate。這個工具集中包含了大量可以通過命令列來操作表的指令。讓我們可以很輕鬆的新增新的表,新的字段。

而在我們介紹這個遷移工具之前,我們先需要了解另外乙個庫:flask_script庫,這個庫首先幫我們實現了讓我們可以在命令列呼叫pytho檔案中寫的函式,實現了這個功能之後我們就可以用同樣的方式在命令行當中去操作表了,而我們的遷移工具的指令實際上也是通過python檔案中的函式來實現的。所以就相當於flask_script幫我們完成了命令列操作檔案中函式的事情,而flask_migrate中就集合了大量的可以運算元據庫的指令。兩者完美的結合,就使得我們可以通過命令列運算元據庫了。

好讓我們先來了解怎麼通過flask_script實現命令列執行python中函式的。

首先通過命令pip install flask-script

新建檔案 script1.py 輸入以下**,**注釋如下:

from flask import flask

from flask_script import manager # 引入指令碼命令列類

@manager.command # 通過裝飾器將普通函式變成可以通過命令列執行的函式

defcmd_hello()

:print

('命令列列印hello'

)if __name__ ==

'__main__'

: manager.run(

)

然後,在命令列找到此檔案所在位置,輸入命令python script1.py cmd_hello並執行。如果你能看到命令列輸出:命令列列印hello代表已經成功通過命令列執行了函式cmd_hello了。

上面我們已經實現了通過命令列執行函式的功能,我們還可以將乙個函式集,比如將運算元據庫的命令放到乙個檔案當中,然後再將命令新增到manager當中,並增加字首,這樣我們就可以實現通過命令列呼叫乙個檔案當中所有函式的功能了。**如下:

# 檔案script2

from flask import flask

from flask_script import manager

from cmd_db import dbmanager

manager.add_command(

'db'

, dbmanager)

#@manager.command

defcmd_hello()

:print

('命令列列印hello'

)if __name__ ==

'__main__'

: manager.run(

)

# 與script2.py同級目錄下檔案cmd_db.py檔案

from flask_script import manager

dbmanager = manager(

)@dbmanager.command

defconnect_mysql()

:print

('連線mysql資料庫'

)@dbmanager.command

defselect_one()

:print((

'查詢單個'

))

這樣我們就可以通過命令:python script2.py db connect_mysqlpython script2.py db select_one來執行上面兩個函式了。

結合上面例子的思想,我們也可以用同樣的道理將遷移命令引入進來。**如下:

from flask import flask

from flask_sqlalchemy import sqlalchemy

'setting'

)

# setting.py檔案

debug =

true

sqlalchemy_database_uri =

'mysql+pymysql:'

sqlalchemy_echo =

true

sqlalchemy_track_modifications =

false

secret_key =

'123'

# models.py

*class

article

(db.model):id

= db.column(db.integer, primary_key=

true

, comment=

'主鍵id'

) title = db.column(db.string(30)

, nullable=

false

, comment=

'文章標題'

)

# script3.py檔案

*from flask_script import manager

from flask_migrate import migrate, migratecommand # 引入遷移庫和遷移命令集

from models import

*# 引入模型

# 例項化命令列類

# 例項化遷移類

manager.add_command(

'db'

, migratecommand)

# 將遷移命令新增到可以通過命令列執行的命令中,並加字首db

if __name__ ==

'__main__'

: manager.run(

)# 執行命令列指令碼

然後再命令列依次執行如下三個命令:

①、python script3.py db init初始化遷移檔案,執行之後,會生成遷移資料夾,記錄初始化的版本。

②、python script3.py db migrate生成與models檔案當中定義的模型的遷移檔案,記錄了資料庫的表、字段資訊等。

③、python script3.py db upgrade將遷移檔案對映到資料庫生成資料庫的表

如果以上三個命令執行之後,成功在資料庫建立了article表,並且包含兩個欄位id和title的話,就說明建立表成功。

修改models檔案。

# models.py檔案

class

article

(db.model):id

= db.column(db.integer, primary_key=

true

, comment=

'主鍵id'

) title = db.column(db.string(30)

, nullable=

false

, comment=

'文章標題'

) content = db.column(db.text, comment=

'文章內容'

)

重複執行

python script3.py db migratepython script3.py db upgrade命令,如果看到content欄位被增加成功,那就說明資料庫遷移成功。

Flask資料庫遷移

在開發過程中,需要修改資料庫模型,且還要在修改之後更新資料庫。最直接的 式就是刪除 舊表,但這樣會丟失資料。更好的解決辦法是使 資料庫遷移框架,它可以追蹤資料庫模式的變化,然後把變動應 到資料 庫中。在flask中可以使 flask migrate擴充套件,來實現資料遷移。並且整合到flask sc...

flask資料庫遷移

1.pip3 install flask script 安裝專案管理包 flask script 2.pip3 install flask migrate 安裝資料遷移包 flask migrate 1.匯入包 from flask script import manager from flask ...

flask 資料庫遷移

安裝flask migrate pip install flask migratepython manager.py db init 自動建立遷移指令碼有兩個函式 upgrade 函式把遷移中的改動應用到資料庫中。downgrade 函式則將改動刪除。python manager.py db mig...