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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何用flask在資料庫新增資料Flask資料庫
- 教你如何使用flask實現ajax資料入庫Flask
- flask筆記:flask與資料庫的互動Flask筆記資料庫
- Flask學習之旅--資料庫Flask資料庫
- flask框架資料庫部分(四)Flask框架資料庫
- Flask資料庫連線池Flask資料庫
- 資料庫-批次更新資料庫
- 資料庫-批量更新資料庫
- 如何批量更新資料
- Flask入門到放棄(四)—— 資料庫Flask資料庫
- flask資料庫遷移是什麼意思Flask資料庫
- flask資料庫遷移 No changes in schema detected.Flask資料庫
- Flask連線資料庫打怪升級之旅Flask資料庫
- Ibatis批量更新資料(mysql資料庫)BATMySql資料庫
- 自動更新資料庫資料的shell資料庫
- Flask web開發第五章資料庫FlaskWeb資料庫
- 簡單分析Flask 資料庫遷移詳情Flask資料庫
- 大白話說Python+Flask入門(六)Flask SQLAlchemy操作mysql資料庫PythonFlaskMySql資料庫
- 資料庫同步更新問題?資料庫
- MongoDB資料庫中更新與刪除資料MongoDB資料庫
- Flask——請求資料Flask
- Flask資料互動Flask
- Flask+Mysql搭建網站之資料庫問題FlaskMySql網站資料庫
- MySQL更新資料,如何使用updateMySql
- MySQL 如何實現資料更新MySql
- .NET 資料庫大資料 方案(插入、更新、刪除、查詢 、插入或更新)資料庫大資料
- flask,mysql如何設定資料庫中的VIP會員時長為一個月FlaskMySql資料庫
- Flask——資料的查詢Flask
- deepsql資料庫工具1.2更新SQL資料庫
- 動態更新資料庫指令碼——Mysql資料庫指令碼MySql
- 國產資料庫考試資料彙總(持續更新)資料庫
- Code First 遷移更新資料庫 無需刪除當前資料庫資料庫
- Flask框架從入門到精通之模型資料庫配置(十一)Flask框架模型資料庫
- 急!請教資料庫記錄改變了如何通知頁面更新?資料庫
- Flask框架使用藍圖劃分目錄、g物件、使用資料庫連線池連結資料庫Flask框架物件資料庫
- 如何修改資料庫例項及資料庫名資料庫
- .NET 百萬級 大資料插入、更新 ,支援多種資料庫大資料資料庫
- Android資料自己主動更新庫DataAutoRefreshAndroid