ORM與惰性機制

那麼首先要知道什麼是ORMjavascript

專業化的角度來講:叫對象關係映射(Object-Relation Mapping)是一種爲了解決面向對象與關係數據庫存在的互不匹配的現象的技術。html

那具體ORM是什麼呢?:(在django中,根據代碼中的類自動生成數據庫的表也叫--code first)ORM:java

 

ORM在面向對象模型與關係模型之間架起橋樑。mysql

經過對象與數據庫之間映射的元數據,自動透明地把編譯語音中的對象持久化到關係數據庫裏,對數據庫的操做能夠轉換爲對對象的操做sql

 

到目前爲止,當咱們的程序設計到數據庫相關操做時,咱們通常都會這麼搞:數據庫

先建立數據庫,設計表結構和字段,使用列如mysqldb這類的模塊來鏈接數據庫,django

並編寫數據訪問層代碼緩存

業務邏輯層去調用數據訪問層執行數據庫操做架構

三層架構詳解app

 簡單說,ORM 就是經過實例對象的語法,完成關係型數據庫的操做的技術,是"對象-關係映射"(Object/Relational Mapping) 的縮寫。

ORM 把數據庫映射成對象。

  • 數據庫的表(table) --> 類(class)
  • 記錄(record,行數據)--> 對象(object)
  • 字段(field)--> 對象的屬性(attribute)

舉例來講,下面是一行 SQL 語句。

SELECT id, first_name, last_name, phone, birth_date, sex FROM persons WHERE id = 10

程序直接運行 SQL,操做數據庫的寫法以下。

res = db.execSql(sql); name = res[0]["FIRST_NAME"];

改爲 ORM 的寫法以下。

p = Person.get(10); name = p.first_name;

 

總結起來,ORM 有下面這些優勢

  • 數據模型都在一個地方定義,更容易更新和維護,也利於重用代碼。
  • ORM 有現成的工具,不少功能均可以自動完成,好比數據消毒、預處理、事務等等。
  • 它迫使你使用 MVC 架構,ORM 就是自然的 Model,最終使代碼更清晰。
  • 基於 ORM 的業務代碼比較簡單,代碼量少,語義性好,容易理解。
  • 你沒必要編寫性能不佳的 SQL。

 

可是,ORM 也有很突出的缺點

  • ORM 庫不是輕量級工具,須要花不少精力學習和設置。
  • 對於複雜的查詢,ORM 要麼是沒法表達,要麼是性能不如原生的 SQL。
  • ORM 抽象掉了數據庫層,開發者沒法瞭解底層的數據庫操做,也沒法定製一些特殊的 SQL。

 

Django惰性機制

所謂惰性機制:Publisher.objects.all()或者.filter()等都只是返回了一個QuerySet(查詢結果集對象),它並不會立刻執行sql,而是當調用QuerySet的時候才執行。

惰性機制之可迭代

1
2
3
# objs=models.Book.objects.all() # [obj1,obj2,ob3...]
for obj in objs: # 每一obj就是一個行對象,此時會執行sql
#     print("obj:",obj)

惰性機制之可切片

1
2
3
4
# objs=models.Book.objects.all() # [obj1,obj2,ob3...]
# print(objs[1])
# print(objs[1:4])
# print(objs[::-1])

惰性機制之Django緩存問題

    Django有本身的緩存,若是2次的obj對象一致,第二次的查值直接從緩存中取值。

    若是期間數據庫的內容做了更改,則須要從新查值。不然容易產生髒數據。

    能夠直接利用第一次的obj對象直接進行update操做,這樣下次for循環查詢時又從新執行了數據庫查詢操做,此時緩存也做了更改; 也能夠從新手動查詢一下結果,可是不推薦這樣,由於咱們並不知道數據何時會進行修改,妥善的仍是Django用數據時本身去查詢數據結果

 

若是2次操做之間有數據進行了修改 ,則須要從新從數據庫中查值,不然Django會從緩存中取出數據,影響最後的查詢結果

相關文章
相關標籤/搜索