flask如何更新資料庫

dead_lee發表於2021-09-11

flask如何更新資料庫

更新資料庫庫表

模型類(表)不是一成不變的,當你新增了新的模型類,或是在模型類中新增了新的欄位,甚至是修改了欄位的名稱或型別,都需要更新表。在前面我們把資料庫表比成盛放貨物的貨架,這些貨架是固定生成的。當我們在操控程式(DBMS/ORM)變更了貨架的結構時,倉庫的貨架也要根據變化相應進行調整。而且,當貨架的結構產生變動時,我們還需要考慮如何處理貨架上的貨物(資料)。

當你在資料庫的模型中新增了一個新的欄位後,比如在Note模型裡新增了一個儲存筆記建立時間的timestamp欄位。

class Note(db.Model):
    id = db.Column(db.Integer, primary_key=True)    timeStamp = db.Column(db.String(70), unique=True)
    body = db.Column(db.Text)    def __repr__(self):        # %r是用repr()方法處理物件,返回型別本身,而不進行型別轉化
        return '<Note %r>' % self.body

此時模型類的定義中,加入了一個新的列,在命令列介面初始化資料時,只給了body賦了值,此時訪問這個表的資料時,這條資料有一個欄位沒有初始化,就是表的結構變化了,需要更新這個表結構,才能正常訪問。

這時在命令列裡檢視note表的欄位時,會看到報錯:

>>> Note.query.all()
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: note.timeStamp
[SQL: SELECT note.id AS note_id, note."timeStamp" AS "note_timeStamp", note.body AS note_body
FROM note]

這段錯誤資訊支出note表中沒有timestamp列,並在中括號裡給出了查詢所對應的SQL原語,之所以會出錯,是因為資料庫並不會隨著模型的修改而自動更新。就像之前關於倉庫的比喻,倉庫裡來了一批新型別的貨物,可我們還沒為他們安排響應的貨架,這當然要出湊了,下面學習如果更新資料庫。

重新生成表

重新呼叫create_all()方法並不會起到更新表或重新建立表的作用。如果你並不在意表中的資料,最簡單的方法是使用drop_all()方法刪除表以及其中的資料,然後再使用create_all()方法重新建立:

>>> db.drop_all()
>>> db.create_all()

這會清除資料庫裡的原有資料,請勿在生產環境下使用。

為了方便開發,我們修改initdb命令函式的內容,為其增加一個—drop選項來支援刪除表和資料庫後進行重建,如下所示:

app.py: 支援刪除表後重建

@app.cli.command()
@click.option('--drop', is_flag=True, help='Create after drop')def initdb(drop):    """Initialize the database."""
    if drop:
        click.confirm('This operation will delete the database, do you want to continue?', abort = True)
        db.drop_all()
        click.echo('Drop tables.')
    db.create_all()
    click.echo('Initialized database.')

在這個命令函式前,我們使用click提供的option裝飾器為命令新增了一個—drop選項,將is_flag引數設為True可以將這個選項宣告為布林值標誌(boolean flag)。--drop選項的值作為drop引數傳入命令函式,如果提供了這個選項,那麼drop的值將是True,否則為False。因為新增—drop選項會直接清空資料庫內容,如果需要,也可以透過click.confirm()函式新增一個確認提示,這樣只有輸入y或yes才會繼續執行操作。

下面來用這個命令重建資料庫和表:

(Lenovo-ezd1lI9Y) D:flaskFLASK_PRACTICEDataBase>flask initdb --dropThis operation will delete the database, 
do you want to continue? [y/N]: y
Drop tables.
Initialized database.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4686/viewspace-2836906/,如需轉載,請註明出處,否則將追究法律責任。

相關文章