1.ORM模型介紹
隨著項(xiàng)目越來(lái)越大祭衩,采用寫(xiě)原生SQL的方式在代碼中會(huì)出現(xiàn)大量的SQL語(yǔ)句所坯,那么問(wèn)題就出現(xiàn)了:
1.SQL語(yǔ)句重復(fù)利用率不高晒骇,越復(fù)雜的SQL語(yǔ)句條件越多纳胧,代碼越長(zhǎng)镰吆。會(huì)出現(xiàn)很多相近的SQL語(yǔ)句。
2.很多SQL語(yǔ)句是在業(yè)務(wù)邏輯中拼出來(lái)的跑慕,如果有數(shù)據(jù)庫(kù)需要更改万皿,就要去修改這些邏輯,這會(huì)很容易漏掉對(duì)某些SQL語(yǔ)句的修改。
3.寫(xiě)SQL時(shí)容易忽略web安全問(wèn)題相寇,給未來(lái)造成隱患慰于。SQL注入。
select * from user where username = 'zjk'#' and password = ''
select * from user where username = 'zjk'-- ' and password = ''
select * from sqldb_book where id = -1 or 1=1
1.1 ORM
全稱(chēng)Object Relational Mapping唤衫,中文叫做對(duì)象關(guān)系映射婆赠,通過(guò)ORM我們可以通過(guò)類(lèi)的方式去操作數(shù)據(jù)庫(kù),而不用再寫(xiě)原生的SQL語(yǔ)句佳励。通過(guò)把表映射成類(lèi)休里,把行作實(shí)例,把字段作為屬性赃承,ORM在執(zhí)行對(duì)象操作的時(shí)候最終還是會(huì)把對(duì)應(yīng)的操作轉(zhuǎn)換為數(shù)據(jù)庫(kù)原生語(yǔ)句妙黍。
from django.db import models
# 創(chuàng)建一個(gè)模型,對(duì)應(yīng)數(shù)據(jù)庫(kù)中的一張表
class Book(models.Model):
id = models.AutoField()
name = models.CharField(max_length=100)
author = models.CharField(max_length=100)
price = models.FloatField()
# 一個(gè)模型的對(duì)象,對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的一條數(shù)據(jù)
book = Book(name="Python",author='龜叔',price=89)
# save方法,保存
book.save()
# delete方法,刪除
book.delete()
1.2 使用ORM的優(yōu)點(diǎn)
1.易用性:使用ORM做數(shù)據(jù)庫(kù)的開(kāi)發(fā)可以有效的減少重復(fù)SQL語(yǔ)句的概率瞧剖,寫(xiě)出來(lái)的模型也更加直觀(guān)拭嫁、清晰。
2.性能損耗凶ビ凇:ORM轉(zhuǎn)換成底層數(shù)據(jù)庫(kù)操作指令確實(shí)會(huì)有一些開(kāi)銷(xiāo)做粤。但從實(shí)際的情況來(lái)看,這種性能損耗很少(不足5%)捉撮,只要不是對(duì)性能有嚴(yán)苛的要求怕品,綜合考慮開(kāi)發(fā)效率、代碼的閱讀性巾遭,帶來(lái)的好處要遠(yuǎn)遠(yuǎn)大于性能損耗肉康,而且項(xiàng)目越大作用越明顯。
3.設(shè)計(jì)靈活:可以輕松的寫(xiě)出復(fù)雜的查詢(xún)灼舍。
4.可移植性:Django封裝了底層的數(shù)據(jù)庫(kù)實(shí)現(xiàn)吼和,支持多個(gè)關(guān)系數(shù)據(jù)庫(kù)引擎,包括流行的MySQL骑素、PostgreSQL和SQLite炫乓。可以非常輕松的切換數(shù)據(jù)庫(kù)砂豌。
2. 創(chuàng)建ORM模型
ORM模型一般都是放在app的models.py
文件中厢岂。每個(gè)app都可以擁有自己的模型光督。并且如果這個(gè)模型想要映射到數(shù)據(jù)庫(kù)中阳距,那么這個(gè)app必須要放在settings.py
的INSTALLED_APP
中進(jìn)行安裝。以下是寫(xiě)一個(gè)簡(jiǎn)單的書(shū)籍ORM模型结借。
from django.db import models
class Book(models.Model):
id = models.AutoField(primary_key=True)
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ù)庫(kù)中,就必須繼承自這個(gè)類(lèi)咖熟。這個(gè)模型以后映射到數(shù)據(jù)庫(kù)中圃酵,表名是模型名稱(chēng)的小寫(xiě)形式,為book馍管。在這個(gè)表中郭赐,有四個(gè)字段,一個(gè)為name确沸,這個(gè)字段是保存的是書(shū)的名稱(chēng)捌锭,是varchar類(lèi)型,最長(zhǎng)不能超過(guò)20個(gè)字符罗捎,并且不能為空观谦。第二個(gè)字段是作者名字類(lèi)型,同樣也是varchar類(lèi)型桨菜,長(zhǎng)度不能超過(guò)20個(gè)豁状。第三個(gè)是出版時(shí)間,數(shù)據(jù)類(lèi)型是datetime類(lèi)型倒得,默認(rèn)是保存這本書(shū)籍的時(shí)間泻红。第五個(gè)是這本書(shū)的價(jià)格,是浮點(diǎn)類(lèi)型屎暇。
還有一個(gè)字段我們沒(méi)有寫(xiě)承桥,就是主鍵id,在django中根悼,如果一個(gè)模型沒(méi)有定義主鍵凶异,那么將會(huì)自動(dòng)生成一個(gè)自動(dòng)增長(zhǎng)的int類(lèi)型的主鍵,并且這個(gè)主鍵的名字就叫做id挤巡。
3. 映射模型到數(shù)據(jù)庫(kù)中
將ORM模型映射到數(shù)據(jù)庫(kù)中剩彬,總結(jié)起來(lái)就是以下幾步:
1.在settings.py中,配置好DATABASES
矿卑,做好數(shù)據(jù)庫(kù)相關(guān)的配置喉恋。
2.在app中的models.py
中定義好模型,這個(gè)模型必須繼承自django.db.models
母廷。
3.將這個(gè)app添加到settings.py
的INSTALLED_APP
中轻黑。
4.在命令行終端,進(jìn)入到項(xiàng)目所在的路徑琴昆,然后執(zhí)行命令python [manage.py](http://manage.py/) makemigrations
來(lái)生成遷移腳本文件氓鄙。
5.同樣在命令行中,執(zhí)行命令python [manage.py](http://manage.py/) migrate
來(lái)將遷移腳本文件映射到數(shù)據(jù)庫(kù)中业舍。
4. ORM的增刪改查
4.1 添加數(shù)據(jù)
views.py
--------------------------------------------------------------------
from django.shortcuts import render
from django.db import connection
from .models import Book
from django.http import HttpResponse
def add_book(request):
book = Book(name="Python",author="JR",price=78)
book.save()
return HttpResponse("書(shū)籍添加成功")
4.2 查詢(xún)數(shù)據(jù)
4.2.1.根據(jù)主鍵進(jìn)行查找
book = Book.objects.get(pk=1)
print(book)
4.2.2.根據(jù)其他條件來(lái)查找
book = Book.objects.filter(name="Python")
print(book)
4.2.3.查詢(xún)所有
book = Book.objects.all()
4.3 刪除數(shù)據(jù)
book = Book.objects.get(pk=1)
book.delete()
4.4修改數(shù)據(jù)
book = Book.objects.get(pk=2)
book.price = 200
book.save()
注:刪除和修改都需要先將我們要操作的數(shù)據(jù)查詢(xún)出來(lái)之后再操作抖拦。