# Flask Extension(02)\_Flask-SQLAlchemy(2) ###### tags: `book` `flask` `flask 2.x` `flask extension` `sqlalchemy` `python` [Flask-SQLAlchemy](https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/) [SQLAlchemy](https://docs.sqlalchemy.org/) 我們已經成功利用model生成table,以系統面來看,[CRUD](https://zh.m.wikipedia.org/zh-tw/%E5%A2%9E%E5%88%AA%E6%9F%A5%E6%94%B9)是系統對資料庫會有的四種基礎操作,我們就在這邊演練一番。 ## 操作model sqlalchemy在經過改版之後的資料查詢方式已經跟之前不一樣了,相對應的,flask-sqlalchemy也跟著變化,如果你想執行查詢,請使用表達式`db.session.execute(db.select(Model).order_by(Model.prop)).scalars()`或是`db.session.execute(db.select(Model).order_by(Model.prop)).scalar()` :::info **Notes:** 相關資料查詢的部份可以參考[sqlalchemy](https://docs.sqlalchemy.org/en/14/tutorial/data_select.html)說明 ::: 如果是`scalars`的話,得到的資料會是一個`ScalarResult`的物件,不過我們現在的資料表並沒有任何的資料存在,所以要來寫入一筆: ```python= user = User(username='shaoe.chen', email='shaoe.chen@email.com') with app.app_context(): db.session.add(user) db.session.commit() ``` 我們使用ORM的方式,基本上就是new一個model,然後給定欄位值,因為我們是測試,這個操作必需是在flask的context中執行,所以就用`with app.app_context()`,裡面最重要的當然就是`db.session`,`db.session.add`意謂著我們把這個資料寫入資料庫,而`db.session.commit()`則是完成這筆交易記錄,不是那麼建議設置auto commit就是了。  當然,我們可以使用一些工具來檢查資料是否確實的寫入資料庫。 接下來我們就可以嚐試來做查詢,一樣的,利用上面所說的表達式,做一次驗證確認: ```python= user = None with app.app_context(): user = db.session.execute(db.select(User).order_by(User.id)).scalar() ``` 下面給出結果: ```python= user <User 1> ``` 很明顯的就是,如果是`scalar()`的話,得到的會是單筆的記錄,直接就是`User`這個物件。 接下來,我們來看一下怎麼處理另一個`scalars()`: ```python= user = None with app.app_context(): user = db.session.execute(db.select(User).order_by(User.id)).scalars().fetchall() ``` 作法上比較不一樣是因為,利用`scalars`取回的資料是一個`ScalarResult`的物件,接續的就是看你要怎麼去操作它。`fetchall()`就是將所有的資料一次取回,這時候得到的就會是一個list: ```python= user [<User 1>] ``` :::info **Notes:** 非常建議你自己手動再補一筆資料進去,然後再執行一次查詢看看結果。 ::: flask-sqlalchemy有一個更為漂亮的方法,也就是`get_or_404`: ```python= user = None with app.app_context(): user = db.get_or_404(User, 1) ``` 只是說,如果你使用這個函數的話就要注意一下,沒資料它就拋出404,記得做好404的處理就好。這後續實作過程中就會有說明了。 最後再來快速的說說更新跟刪除的方式,如果是刪除的話就利用`db.session.delete`,這很直觀,如果是更新的話就把model當做物件一般的操作即可,最後記得加上`db.session.commit`: ```python= user.username='ShaoeChen' with app.app_context(): db.session.add(user) db.session.commit() ``` 雖然官方文件上寫的說明是只要修正屬性之後直接完成這筆交易記錄就好,但是我實測還是要再經過`db.session.add`才能成功寫入。 :::info **Notes:** * 說明過程中會加入`with app.app_context()`是因為,根據官方文件的[quickstart](https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/quickstart/)中所寫,『You must be in an active Flask application context to execute queries and to access the session and engine.』。 * 更多資料操作的部份請參考[Modifying and Querying Data](https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/queries/) ::: ## 結論 我的資料操作都是在pycharm的cmd上執行的,所以每次的操作都需要加入`with app.app_context`,這是因為flask-sqlalchemy的`db.session`只能在flask的上下文中執行,也就是說,等我們進入正式開發的時候就不用再這麼麻煩了。 簡單的範例應該都可以知道ORM的便利性了,但是,這是對一張table的操作,關聯式資料庫,想當然就是會有很多張table互相有關聯,後續就要來瞭解如何設置table之間的關聯對應。楊千老師說,一天不要學太多東西,每天都要學一點,所以就此打住,不急。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up