【Day 10】 Django Models 番外篇(1) – ORM

昨天我們成功在Python Shell新增Records並把這些Records抓出來顯示在網頁上,仔細觀察取得資料表紀錄的那行程式碼,就會發現我們並不是用SQL去撈資料而是用資料表物件(Model Object)自帶的方法去取得資料。

1
2
3
4
5
6
7
8
9
10
11
12
#昨天的程式碼
from django.http import HttpResponse
from django.template import loader
from .models import Members

def index(request):
#取得Members資料表上所有的Records
mymembers = Members.objects.all().values() #取得資料表紀錄
output = ""
for x in mymembers:
output += x["firstname"]
return HttpResponse(output)

那為什麼不是用SQL而是靠資料表物件(Model Object)去操作資料呢?
因為Django的資料庫操作靠的是ORM這個技術。

ORM


(圖片來源)

ORMObject Relational Mapping的簡寫,中文翻譯是物件關聯對映,主要就是將資料庫的資料與物件(Object)相互對應,再實際一點的說法,就是把Django資料庫裡面的資料表(Model)以物件(Object)的型態召喚出來,接著就可以直接用這個物件做資料的CRUD,而不用寫SQL

ORM 的優點

  1. 對於熟悉物件操作的人來說,非常方便
  2. 不會因為資料庫不同,而有原生SQL語言轉換的困擾
  3. 可以防止SQL Injection的問題
  4. 程式碼相對簡潔,因為不會有複雜的SQL出現

SQL Injection : 資料庫收到惡意使用者所輸入的 SQL 指令,在未驗證的情況下就逕自執行,導致惡意使用者可以取得最高權限,進而對資料庫造成未知破壞,其中包括竊取、修改、刪除資料等等。

ORM 的缺點

  1. ORM相對SQL是一個新的觀念,會需要花時間理解不同方法的意義
  2. 因為是先將資料庫資料對應成物件才開始操作,所以在效能上會有點不好
  3. 需要複雜的SQL才能做到的事,用ORM會很難做到一樣的事,導致最後還是要寫SQL

綜合ORM的優點與缺點,可以發現ORM雖然使用上很簡單,但還是有它的侷限性,所以還是要學點SQL會比較好解決複雜的問題。

今天沒有需要動手做的東西非常輕鬆,而明天依然會是Django Models的番外篇,要來稍微補充說明前面看起來很謎的migratemakemigrations等等。

分享到