昨天我們成功在Python Shell
新增Records
並把這些Records
抓出來顯示在網頁上,仔細觀察取得資料表紀錄的那行程式碼,就會發現我們並不是用SQL
去撈資料而是用資料表物件(Model Object
)自帶的方法去取得資料。
1 | #昨天的程式碼 |
那為什麼不是用SQL
而是靠資料表物件(Model Object
)去操作資料呢?
因為Django
的資料庫操作靠的是ORM
這個技術。
ORM
(圖片來源)
ORM
是Object Relational Mapping
的簡寫,中文翻譯是物件關聯對映,主要就是將資料庫的資料與物件(Object
)相互對應,再實際一點的說法,就是把Django
資料庫裡面的資料表(Model
)以物件(Object
)的型態召喚出來,接著就可以直接用這個物件做資料的CRUD
,而不用寫SQL
。
ORM 的優點
- 對於熟悉物件操作的人來說,非常方便
- 不會因為資料庫不同,而有原生
SQL
語言轉換的困擾 - 可以防止
SQL Injection
的問題 - 程式碼相對簡潔,因為不會有複雜的
SQL
出現
SQL Injection : 資料庫收到惡意使用者所輸入的 SQL 指令,在未驗證的情況下就逕自執行,導致惡意使用者可以取得最高權限,進而對資料庫造成未知破壞,其中包括竊取、修改、刪除資料等等。
ORM 的缺點
ORM
相對SQL
是一個新的觀念,會需要花時間理解不同方法的意義- 因為是先將資料庫資料對應成物件才開始操作,所以在效能上會有點不好
- 需要複雜的
SQL
才能做到的事,用ORM
會很難做到一樣的事,導致最後還是要寫SQL
綜合ORM
的優點與缺點,可以發現ORM
雖然使用上很簡單,但還是有它的侷限性,所以還是要學點SQL
會比較好解決複雜的問題。
今天沒有需要動手做的東西非常輕鬆,而明天依然會是
Django Models
的番外篇,要來稍微補充說明前面看起來很謎的migrate
和makemigrations
等等。