ORM模型介紹
隨著項(xiàng)目越來越大,采用寫原生SQL的方式在代碼中會出現(xiàn)大量的SQL語句愧薛,那么問題就出現(xiàn)了:
- SQL語句重復(fù)利用率不高杯缺,越復(fù)雜的SQL語句條件越多砰左,代碼越長匿醒。會出現(xiàn)很多相近的SQL語句。
- 很多SQL語句是在業(yè)務(wù)邏輯中拼出來的缠导,如果有數(shù)據(jù)庫需要更改廉羔,就要去修改這些邏輯,這會很容易漏掉對某些SQL語句的修改酬核。
- 寫SQL時(shí)容易忽略web安全問題蜜另,給未來造成隱患。SQL注入嫡意。
ORM
举瑰,全稱Object Relational Mapping
,中文叫做對象關(guān)系映射蔬螟,通過ORM
我們可以通過類的方式去操作數(shù)據(jù)庫此迅,而不用再寫原生的SQL語句。通過把表映射成類旧巾,把行作實(shí)例耸序,把字段作為屬性,ORM
在執(zhí)行對象操作的時(shí)候最終還是會把對應(yīng)的操作轉(zhuǎn)換為數(shù)據(jù)庫原生語句鲁猩。使用ORM
有許多優(yōu)點(diǎn):
- 易用性:使用
ORM
做數(shù)據(jù)庫的開發(fā)可以有效的減少重復(fù)SQL語句的概率坎怪,寫出來的模型也更加直觀、清晰廓握。 - 性能損耗薪亮:
ORM
轉(zhuǎn)換成底層數(shù)據(jù)庫操作指令確實(shí)會有一些開銷。但從實(shí)際的情況來看隙券,這種性能損耗很少(不足5%)男应,只要不是對性能有嚴(yán)苛的要求,綜合考慮開發(fā)效率娱仔、代碼的閱讀性沐飘,帶來的好處要遠(yuǎn)遠(yuǎn)大于性能損耗,而且項(xiàng)目越大作用越明顯牲迫。 - 設(shè)計(jì)靈活:可以輕松的寫出復(fù)雜的查詢耐朴。
- 可移植性:
Django
封裝了底層的數(shù)據(jù)庫實(shí)現(xiàn),支持多個(gè)關(guān)系數(shù)據(jù)庫引擎盹憎,包括流行的MySQL
隔箍、PostgreSQL
和SQLite
〗畔纾可以非常輕松的切換數(shù)據(jù)庫蜒滩。
創(chuàng)建ORM模型:
ORM
模型一般都是放在app
的models.py
文件中。每個(gè)app
都可以擁有自己的模型奶稠。并且如果這個(gè)模型想要映射到數(shù)據(jù)庫中俯艰,那么這個(gè)app
必須要放在settings.py
的INSTALLED_APP
中進(jìn)行安裝。以下是寫一個(gè)簡單的書籍ORM
模型锌订。示例代碼如下:
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
author = models.CharField(max_length=20,null=False)
pub_time = models.DateTimeField(default=datetime.now)
price = models.FloatField(default=0)
以上便定義了一個(gè)模型竹握。這個(gè)模型繼承自django.db.models.Model
,如果這個(gè)模型想要映射到數(shù)據(jù)庫中辆飘,就必須繼承自這個(gè)類啦辐。這個(gè)模型以后映射到數(shù)據(jù)庫中谓传,表名是模型名稱的小寫形式,為book
芹关。在這個(gè)表中续挟,有四個(gè)字段,一個(gè)為name
侥衬,這個(gè)字段是保存的是書的名稱诗祸,是varchar
類型,最長不能超過20個(gè)字符轴总,并且不能為空直颅。第二個(gè)字段是作者名字類型,同樣也是varchar
類型怀樟,長度不能超過20個(gè)功偿。第三個(gè)是出版時(shí)間,數(shù)據(jù)類型是datetime
類型往堡,默認(rèn)是保存這本書籍的時(shí)間脖含。第五個(gè)是這本書的價(jià)格,是浮點(diǎn)類型投蝉。
還有一個(gè)字段我們沒有寫养葵,就是主鍵id
,在django
中瘩缆,如果一個(gè)模型沒有定義主鍵关拒,那么將會自動生成一個(gè)自動增長的int
類型的主鍵,并且這個(gè)主鍵的名字就叫做id
庸娱。
映射模型到數(shù)據(jù)庫中:
將ORM
模型映射到數(shù)據(jù)庫中着绊,總結(jié)起來就是以下幾步:
在
settings.py
中,配置好DATABASES
熟尉,做好數(shù)據(jù)庫相關(guān)的配置归露。在
app
中的models.py
中定義好模型,這個(gè)模型必須繼承自django.db.models
斤儿。將這個(gè)
app
添加到settings.py
的INSTALLED_APP
中剧包。在命令行終端,進(jìn)入到項(xiàng)目所在的路徑往果,然后執(zhí)行命令
python manage.py makemigrations
來生成遷移腳本文件疆液。同樣在命令行中,執(zhí)行命令
python manage.py migrate
來將遷移腳本文件映射到數(shù)據(jù)庫中陕贮。