1. 程式人生 > >Django中mysql資料庫的增刪改查

Django中mysql資料庫的增刪改查

一、增加
1) save:通過建立模型類物件,執行物件的save()方法儲存到資料庫中。
例如:

In [1]: from demo_class.models import BookInfo
In [2]: from datetime import date
In [3]: from demo_class.models import HeroInfo
In [4]: book = BookInfo(btitle = 'wang',bpub_date = date(1990,10,10))
In [5]: book.save()

2)create():通過模型類.objects.create()儲存。

In [11]: HeroInfo.objects.create(
    ...: hname = '沙悟淨',
    ...: hgender = 0,
    ...: hbook = book
    ...: )
Out[11]: <HeroInfo: 沙悟淨>

二、查詢
1.基本查詢

all 方法返回所有資料

In [12]: BookInfo.objects.all()
Out[12]: <QuerySet [<BookInfo: 射鵰英雄傳>, <BookInfo: 天龍八部>, <BookInfo: 笑傲江湖>
雪山飛狐>, <BookInfo: 西遊記>, <BookInfo: wang>, <BookInfo: wang>]>

get 查詢單一結果,如果不存在會丟擲模型類.DoesNotExist異常。

In [13]: BookInfo.objects.get(id = 3)
Out[13]: <BookInfo: 笑傲江湖>
In [14]: BookInfo.objects.get(id = 100)
DoesNotExist: BookInfo matching query does not exist.

count 查詢結果數量。

In [15]: BookInfo.objects.count()
Out[15]: 7

2.過濾查詢

*filter 過濾出多個結果
exclude 排除掉符合條件剩下的結果
get 過濾單一結果*
過濾條件的表達語法如下:
**屬性名稱__比較運算子=值
屬性名稱和比較運算子間使用兩個下劃線,所以屬性名不能包括多個下劃線**

對於過濾條件的使用,上述三個方法相同,故僅以filter進行講解。

In [17]: BookInfo.objects.filter(id__in = [1,2,3,4])
Out[17]: <QuerySet [<BookInfo: 射鵰英雄傳>, <BookInfo: 天龍八部>, <BookInfo: 笑傲江湖>雪山飛狐>]>

1)相等
exact:表示判等。
例:查詢編號為2的圖書。

BookInfo.objects.filter(id__exact=2)
# 可簡寫為:
BookInfo.objects.filter(id=1)

2)模糊查詢
contains:是否包含。
說明:如果要包含%無需轉義,直接寫即可。
例:查詢書名包含’傳’的圖書。

BookInfo.objects.filter(btitle__contains='傳')

startswith、endswith:以指定值開頭或結尾。
例:查詢書名以’部’結尾的圖書

BookInfo.objects.filter(btitle__endswith='部')

以上運算子都區分大小寫,在這些運算子前加上i表示不區分大小寫,如iexact、icontains、istartswith、iendswith.

3) 空查詢
isnull:是否為null。
例:查詢書名不為空的圖書。

BookInfo.objects.filter(btitle__isnull=False)

4) 範圍查詢
in:是否包含在範圍內。
例:查詢編號為1或3或5的圖書

BookInfo.objects.filter(id__in=[1, 3, 5])

5)比較查詢
gt 大於 (greater then)
gte 大於等於 (greater then equal)
lt 小於 (less then)
lte 小於等於 (less then equal)
例:查詢編號大於3的圖書

BookInfo.objects.filter(id__gt=3)

不等於的運算子,使用exclude()過濾器。
例:查詢編號不等於3的圖書

BookInfo.objects.exclude(id=3)

6)日期查詢
year、month、day、week_day、hour、minute、second:對日期時間型別的屬性進行運算。
例:查詢1980年發表的圖書。

BookInfo.objects.filter(bpub_date__year=1980)

例:查詢1980年1月1日後發表的圖書。

BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))

3.F物件
使用F物件對兩個屬性進行比較,被定義在django.db.models中
語法如下:
F(屬性名)
例:查詢閱讀量大於等於評論量的圖書

from django.db.models import F
# 閱讀量大於等於評論量
BookInfo.objects.filter(bread__gte=F('bcomment'))

可以在F物件上使用算數運算BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
4.Q物件
多個過濾器逐個呼叫表示邏輯與關係,同sql語句中where部分的and關鍵字
例:查詢閱讀量大於20,並且編號小於3的圖書

BookInfo.objects.filter(bread__gt=20,id__lt=3)
# 或
BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)

如果需要實現邏輯或or的查詢,需要使用Q()物件結合|運算子,Q物件被義在django.db.models中。
語法如下:
.Q(屬性名__運算子=值)
例:查詢閱讀量大於20的圖書,改寫為Q物件如下

from django.db.models import Q
BookInfo.objects.filter(Q(bread__gt=20))

Q物件可以使用&、|連線,&表示邏輯與,|表示或,~表示非
例:查詢閱讀量大於20,或編號小於3的圖書,只能使用Q物件實現

# 查詢id=1,2,3**或**書名為西遊記
BookInfo.objects.filter(Q(id__in = [1,2,3]) | Q(btitle = '西遊記'))

查詢編號不等於3的圖書

BookInfo.objects.filter(~Q(pk=3))

5.聚合函式
使用aggregate()過濾器呼叫聚合函式
例:查詢圖書的總閱讀量。

In [14]: from django.db.models import Sum
In [15]:BookInfo.objects.aggregate(Sum('bread'))
Out[15]: {'bread__sum': 136}
# 輸出字典資料

6.排序

BookInfo.objects.all().order_by('bread')  # 升序
BookInfo.objects.all().order_by('-bread')  # 降序

7.關聯查詢
一對多:
一對應的模型類物件.多對應的模型類名小寫_set
例:

# 獲取id為1的圖書下的所有英雄的資訊
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()

多對一
多對應的模型類物件.多對應的模型類中的關係類屬性名
例:

h = HeroInfo.objects.get(id=1)
h.hbook

訪問一對應的模型類關聯物件的id語法:
多對應的模型類物件.關聯類屬性_id
例:

h = HeroInfo.objects.get(id=1)
h.hbook_id

關聯過濾查詢
關聯模型類名小寫_屬性名_條件運算子=值
如果沒有”__運算子”部分,表示等於
查詢圖書中有‘孫悟空’名字的圖書名稱

BookInfo.objects.filter(heroinfo__hname='孫悟空')

查詢書名為“天龍八部”中的所有英雄。

HeroInfo.objects.filter(hbook__btitle='天龍八部')

三、修改
修改更新有兩種方法
1)save
修改模型類物件的屬性,然後執行save()方法

hero = HeroInfo.objects.get(hname='豬八戒')
hero.hname = '豬悟能'
hero.save()

2)update
使用模型類.objects.filter().update(),會返回受影響的行數

HeroInfo.objects.filter(hname='沙悟淨').update(hname='沙僧')

刪除
刪除有兩種方法

1)模型類物件delete

hero = HeroInfo.objects.get(id=13)
hero.delete()

2)模型類.objects.filter().delete()

HeroInfo.objects.filter(id=14).delete()

注意:實際開發中一般不用這種物理刪除,常用邏輯刪除,例如:

book = BookInfo.objects.get(id =1 )
book.is_delete = True
book.save()