-
執行自定義SQL語言:
from django.db import connection ? cursor=connection.cursor() ? # 插入操作 cursor.execute("insert into hello_author(name) values('傳說中的申小五')") ? # 更新操作 cursor.execute("update hello_author set name='abc' where name='bcd'") ? # 刪除操作 cursor.execute("delete from hello_author where name='abc'") ? # 查詢操作 cursor.execute("select * from hello_author") ? raw=cursor.fetchone() # 返回結果行游標直讀向前,讀取一條 cursor.fetchall() # 讀取所有
-
使用raw:
Book.objects.raw('select * from hello_Book') # 返回模型實例
-
使用extra:
models.Book.objects.filter(publisher__name='傳說中的申小五').extra(where=['price>50']) models.Book.objects.filter(publisher__name='傳說中的申小五', price__gt=50) models.Book.objects.extra(select={'count': 'select count(*) from hello_Book'})
?
個人覺得因為原生Django的orm ?比?SQLAlchemy簡單。所以用它。
?
Django ORM 的優點
- 1. 遵循 Active Record 模式,對業務相對來說簡單一些的網站來說,對外暴露了簡簡單單的 OO 操作方式?連 GroupBy 的寫法都看不出來 SQL 的痕跡。
- 2. 對于沒上手 SQL 的人來說,照著文檔擼代碼, 稍微懂一點點SQL, 談笑間簡直就是 Python 一波速推流,簡單而暴力。
缺點
- 1. 沒有 Unit Of Work, 這就導致了你需要大量的依據情況來一個一個object的save
- 2. 沒有 Identity Map, 這就導致了會產生很多duplicated 的sql語句 如果你做跨三個表的查詢的時候,這個現象就特別明顯. 通過 django debug tools 就可以看出來, 當然, 通過 select related 和 prefetch related 也能緩解一下. 或者是走local cache 間接的使用 SQLA
- 3. JOIN 寫起來比較固定。最后發現大部分 JOIN 還是要寫 RAWSQL
?
當然, 上面列的django orm的缺點, 其實sqla幫你解決了大部分
SQLAlchemy 是更加復雜的 ORM 框架,遵循 DataMapper,SQLA 實現了 Unit Of Work , IdentityMap , 對于業務復雜的場景來說,有更好的適應性。
但, 雖然說sqla這么多優點吧, 但架不住復雜到1000多頁的使用說明