天天看點

用 Flask 來寫個輕部落格 (5) — (M)VC_SQLAlchemy 的 CRUD 詳解目錄前文清單擴充閱讀SQLAlchemy 的 CRUDCreate 增添資料Retrieve 讀取資料Update 更新資料Delete 删除資料

<a href="#%E7%9B%AE%E5%BD%95">目錄</a>

<a href="#%E5%89%8D%E6%96%87%E5%88%97%E8%A1%A8">前文清單</a>

<a href="#%E6%89%A9%E5%B1%95%E9%98%85%E8%AF%BB">擴充閱讀</a>

<a href="#sqlalchemy-%E7%9A%84-crud">SQLAlchemy 的 CRUD</a>

<a href="#create-%E5%A2%9E%E6%B7%BB%E6%95%B0%E6%8D%AE">Create 增添資料</a>

<a href="#retrieve-%E8%AF%BB%E5%8F%96%E6%95%B0%E6%8D%AE">Retrieve 讀取資料</a>

<a href="#%E9%99%90%E5%88%B6%E8%BF%94%E5%9B%9E%E8%AE%B0%E5%BD%95%E7%9A%84%E6%95%B0%E7%9B%AE">限制傳回記錄的數目</a>

<a href="#%E8%BF%94%E5%9B%9E%E8%AE%B0%E5%BD%95%E7%9A%84%E6%8E%92%E5%BA%8F">傳回記錄的排序</a>

<a href="#%E6%9F%A5%E8%AF%A2%E5%87%BD%E6%95%B0%E7%9A%84%E9%93%BE%E5%BC%8F%E8%B0%83%E7%94%A8">查詢函數的鍊式調用</a>

<a href="#flask-sqlalchemy-%E7%9A%84%E4%B8%93%E6%9C%89%E5%88%86%E9%A1%B5%E5%87%BD%E6%95%B0-pagination">Flask-SQLAlchemy 的專有分頁函數 pagination</a>

<a href="#query-%E7%9A%84%E8%BF%87%E6%BB%A4%E5%99%A8">Query 的過濾器</a>

<a href="#update-%E6%9B%B4%E6%96%B0%E6%95%B0%E6%8D%AE">Update 更新資料</a>

<a href="#delete-%E5%88%A0%E9%99%A4%E6%95%B0%E6%8D%AE">Delete 删除資料</a>

<a href="http://blog.csdn.net/jmilk/article/details/53150084">用 Flask 來寫個輕部落格 (1) — 建立項目</a>

<a href="http://blog.csdn.net/jmilk/article/details/53152158">用 Flask 來寫個輕部落格 (2) — Hello World!</a>

<a href="http://blog.csdn.net/jmilk/article/details/53153382">用 Flask 來寫個輕部落格 (3) — (M)VC_連接配接 MySQL 和 SQLAlchemy</a>

<a href="http://blog.csdn.net/jmilk/article/details/53184903">用 Flask 來寫個輕部落格 (4) — (M)VC_建立資料模型和表</a>

CRUD 提供了在 Web 應用程式中所需要的所有操作和檢視資料的基礎功能, 尤其在 REST 風格的應用中, CRUD 就能實作一切所需功能.

本篇博文主要記錄 SQLAlchemy 實作 CRUD 的語句, 依然是在 manager shell 中完成:

為了讓在 manager shell 中的執行效果更直覺一些, 首先, 先對 User models 做一些修改:

為建立的 User models 添加一條記錄的操作看起來跟 Git 的送出操作非常類似, 其包含的意義也大緻相同, 是為了盡量減少不必要的 I/O 操作:

add: 把資料添加到會話對象中 (資料狀态為待儲存)

commit: 将會話對象中的資料送出 (資料被寫入資料庫中)

然後再檢視一下資料庫, 檢驗是否生效:

從這個例子可以看出, 一個 class User 的執行個體化對象就是一條包含了字段值的記錄對象, 将該記錄對象添加并送出到 session , 就會把記錄對象的資料寫入到資料庫中.

把資料添加僅資料庫表後, SQLAlchemy 可以通過 Model.query 方法對資料進行查詢. <code>Model.query == db.session.query(Model)</code> 兩種寫法是等效的. 差別在于前者使用的是 flask_sqlalchemy.BaseQuery object, 後者使用的是 sqlalchemy.orm.query.Query object . 但兩者本質上都是一個 Query 對象.

讀取資料有兩種情況:

讀取一條資料: 需要指定唯一的過濾條件來擷取, 一般會使用主鍵作為過濾條件.

讀取多條資料: 指定任意條件作為過濾條件或者不過濾的擷取全部資料

NOTE: 因為在 Flask 中的 SQLAlchemy 擁有 flask-sqlalchemy 和 sqlalchemy.orm 兩種文法, 為了避免看花眼的情況, 以後的代碼中隻會使用通用性更強一些的 sqlalchemy.orm 的文法.

除了上述兩種操作之外, 還有非常之多不同花樣的資料讀取方式, 讀取資料是 4 種操作類型中最複雜多樣的一中操作類型.

這個傳回特征常與資料的分頁功能結合使用.

SQLAlchemy 預設會根據主鍵的順序來排序, 也是要顯示的使用 order_by 函數來指定排序條件和排序的方式:

Query 對象提供了非常多且靈活的資料庫操作抽象方法, 我們可以鍊式的去組合這些方法來達到希望的效果. 但需要注意的是, 删除操作的鍊式調用一定要謹慎而為.

可以使用 dir() 内置函數來檢視一個 Query 對象提供的方法清單.

NOTE: 一條讀取語句的鍊式操作都是一個 first() 或 all() 函數結束的. 它們會終止鍊式調用并傳回結果.

pagination(): 是專門設計來實作分頁功能的函數, 是以必須由 flask_sqlalchemy.BaseQuery object 來調用.

第一個參數表示查詢傳回第幾頁的内容

第二個參數表示每頁顯示的對象數量

paginate() 與 first()/all() 不同, 後者傳回的是一個 models 對象或 models 對象清單, 而前者傳回的是一個 pagination 對象. 而且 pagination 對象還包含了幾個特有的屬性:

在查詢資料時, 可以根據一定的條件集合來獲得過濾後的資料. SQLAlchemy 提供了過濾器 <code>query.filter_by()</code> 和 <code>query.filter()</code>, 過濾器接受的參數就是過濾條件, 有下面幾種形式:

字段鍵值對, EG. <code>username='fanguiju'</code>

比較表達式, EG. <code>User.id &gt; 100</code>

邏輯函數, EG. <code>in_/not_/or_</code>

EXAMPLE:

可以将 <code>query.filter()</code> 内置的邏輯函數 <code>in_/not_/or_</code> 結合使用來實作更複雜的過濾.

如上述例子, 先定位到你希望更新的記錄, 然後通過 Query 對象的 <code>update()</code> 傳遞要更新内容. 注意: 更新的内容必須是 Dict 資料類型.

需要注意的是: 就如使用原生 SQL 指令來更新記錄一樣, 如果沒有指定要更新具體的哪一條記錄的話, 會将該字段所在列的所有記錄值一同更新, 是以切記使用過濾條件來定位到具體需要更新的記錄.

而且 <code>update()</code> 會自動的添加 User 的執行個體化對象到 session 中, 是以直接 commit 就可以寫入到資料庫了.

将查詢傳回的 User 執行個體化對象進行 session 的 delete 操作, 就能夠删除該對象所映射的記錄資料了.