###Django 數據庫
####1.1 ORM框架
O是object,也就類對象的意思,R是relation,翻譯成中⽂是關係,也就是關係數據庫中數據表的意思,M是 mapping,是映射的意思。在ORM框架中,它幫我們把類和數據表進⾏了⼀個映射,可以讓我們通過類和類對象 就能操作它所對應的表格中的數據。ORM框架還有⼀個功能,它可以根據我們設計的類⾃動幫我們⽣成數據庫中 的表格,省去了我們⾃⼰建表的過程。
####1.2django進行數據庫開發的步驟
-
配置數據庫連接信息
-
在models.py中定義模型類
-
遷移
-
通過類和對象完成數據增刪改查操作
#####1.2.1配置
1.安裝MySQL數據庫pip install PyMySQL
2.第⼆步: 進⾏轉換, 讓pymysql的內容轉換爲mysqldb,以便於ORM能夠匹配
# 複製下⾯的內容, 拷⻉到django⼯程同名⼦⽬錄中的init.py⽂件中
# 例如我們項⽬爲:demo,那就拷⻉到demo/demo/init.py中去.
from pymysql import
install_as_MySQLdb install_as_MySQLdb()
3.第三步: 對數據庫進⾏配置: 修改數據庫的ip地址,端⼝號, ⽤戶名等內容
# 這個⽂件在原來的settings.py⽂件中就有, 我們需要⽤下⾯的內容替換原來的內容:
DATABASES = {
'default': {
# 我們這⾥需要把sqlite3修改爲mysql
'ENGINE':'django.db.backends.mysql',
'HOST':'127.0.0.1', # 數據庫主機
'PORT': 3306, # 數據庫端⼝
'USER': 'root', # 數據庫⽤戶名
'PASSWORD': 'mysql', # 數據庫⽤戶密碼
'NAME': 'django_demo' # 數據庫名字
}
}
4.第四步: 修改完成後,就可以創建數據庫定義模型類了.
# 圖書-英雄"管理爲例進⾏演示
# 創建⼦應⽤booktest 在⼦應⽤的
# models.py ⽂件中定義模型類:
# 從django.db中到models from django.db
import models
# 定義圖書模型類BookInfo #
# 注意: ⼀定要繼承⾃models.Model
class BookInfo(models.Model):
# 這⾥定義的屬性對應的都是數據庫中的字段:
# 這⾥定義的時候,可以額外增加字段:
# max_length字符串的最⼤⻓度
# verbose_name在admin站點的名稱. default默認值.
# models.CharField 這個位置指出了當前字段的類型:
btitle = models.CharField(max_length=20, verbose_name='名稱')
bpub_date = models.DateField(verbose_name='發佈⽇期')
bread = models.IntegerField(default=0, verbose_name='閱讀量')
bcomment = models.IntegerField(default=0, verbose_name='評論量')
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')
# 該類⽤於指定數據庫中的表名.
class Meta:
db_table = 'tb_books'
# 指明數據庫表名
verbose_name = '圖書'
# 在admin站點中顯示的名稱
verbose_name_plural = verbose_name
# 顯示的複數名稱
def __str__(self):
"""定義每個數據對象的顯示信息"""
return self.btitle
說明:除⾮我們想要⾃⼰指定⼀個主鍵,這個時候,我們可以在這個屬性的後⾯添加primary_key=true
from django.db import models
#定義英雄模型類HeroInfo
class HeroInfo(models.Model):
# 這個是元組是⼀個可選項,元組中也是元組, 其中:
# 0, 1: 是在數據庫中真實存在的值
# 意味着hgender這個字段在數據庫中存儲的要麼是0,要麼是1
# male, female: ⽤於顯示在admin站點中
# 類似於: verbose_name
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
hname = models.CharField(max_length=20, verbose_name='名稱')
# 性別我們使⽤的是類似於枚舉類型來做的:
# choices: 可選範圍,傳⼊的是個元組類型,在上⾯定義的.
hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性別')
hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
# 利⽤ForeignKey這個屬性指定hbook這個字段爲外鍵.
# 第⼀個參數: 表示外鍵關聯到書籍表
# 注意: 如果調⽤外鍵hbook的話: 返回的是book這個模型對象.
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='圖書') # 外鍵
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')
class Meta:
db_table = 'tb_heros'
verbose_name = '英雄'
verbose_name_plural = verbose_name
def __str__(self):
return self.hname
外鍵
在設置外鍵時,需要通過on_delete選項指明主表刪除數據時,對於外鍵引⽤表數據如何處理,在 django.db.models中包含了可選常量:
on_delete有多少個選項呢:
1.CASCADE: 級聯,刪除主表數據時同時⼀起刪除外鍵表中數據, 級聯刪除。
2.PROTECT : 保護模式,如果採⽤該選項,刪除的時候,會拋出 ProtectedError 錯誤。阻⽌⽤戶的刪除.
3.SET_NULL 置空模式,刪除的時候,外鍵字段被設置爲空,僅在該字段null=True: 允許爲null時可⽤.
4.SET_DEFAULT : 置默認值,刪除的時候,外鍵字段設置爲默認值,所以定義外鍵的時候注意加上⼀個默認值。
5.SET() ⾃定義⼀個值,該值當然只能是對應的實體了,看⼀下代碼:
####1.2.2遷移
第一步:⽣成遷移⽂件
python manage.py makemigrations
第二步:同步到數據庫中
python manage.py migrate
第三步:添加測試數據
###1.3 shell工具
1.進入shell
python manage.py shell
2.查看MySQL數據庫⽇志
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
把68,69⾏前⾯的#去除,然後保存並使⽤如下命令重啓mysql服務。
sudo service mysql restart
使⽤如下命令打開mysql⽇志⽂件
# 可以實時查看數據庫的⽇志內容
tail -f /var/log/mysql/mysql.log
####1.4數據庫操作
增加數據有兩種⽅法:
1. 創建對象添加數據, 然後調⽤ save( ) 保存.
from datetime import date
>>> book = BookInfo(
btitle='⻄遊記',
bpub_date=date(1988,1,1),
bread=10,
bcomment=10 )
>>> book.save()
2. 通過模型類的 create( ) 函數保存.
>>> HeroInfo.objects.create(
hname='沙悟淨',
hgender=0,
hbook=book )
<HeroInfo: 沙悟淨>
查詢
1.get 查詢單⼀結果,如果不存在會拋出模型類.DoesNotExist異常。
BookInfo.objects.get(btitle='⻄遊記')
2.all 查詢多個結果
BookInfo.objects.all()
3.count 查詢結果數量
BookInfo.objects.count()
過濾查詢 -----屬性名稱__⽐較運算符=值
1.filter 過濾出多個結果
BookInfo.objects.filter(id__exact=1)
BookInfo.objects.filter(id=1)
BookInfo.objects.filter(btitle__contains='傳')
BookInfo.objects.filter(btitle__endswith='部')
BookInfo.objects.filter(btitle__isnull=False)
BookInfo.objects.filter(id__in=[1, 3, 5])
BookInfo.objects.filter(id__gt=3)
# year、month、day、week_day、hour、minute、second:對⽇期時間類型的屬性進⾏運算
BookInfo.objects.filter(bpub_date__year=1980)
BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
2.exclude 排除掉符合條件剩下的結果
BookInfo.objects.exclude(id=3)
3.get 過濾單⼀結果
F對象-----F(屬性名)
from django.db.models import F
BookInfo.objects.filter(bread__gte=F('bcomment'))
BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
Q對象
# Q對象: 用於查詢時多個條件之間的邏輯關係 &(且) |(或) ~(非)
from django.db.models import Q
# 1. 查詢閱讀量大於20,並且編號小於3的圖書。
# book3 = BookInfo.objects.filter(bread__gt=20, id__lt=3)
book3 = BookInfo.objects.filter(Q(bread__gt=20)&Q(id__lt=3))
print(book3)
# 2. 查詢閱讀量大於20,或編號小於3的圖書。
book4 = BookInfo.objects.filter(Q(bread__gt=20) | Q(id__lt=3))
print(book4)
# 3. 查詢編號不等於3的圖書。
book5 = BookInfo.objects.filter(~Q(id=3))
print(book5)
# 聚合: count sum avg max min
# # 1. 查詢圖書的總閱讀量。
# # 2. 查詢圖書總數。
# # 3. 對所有圖書按照閱讀量從大到小進行排序。
# '''
from django.db.models import Count, Sum, Avg, Max, Min
# 1. 查詢圖書的總閱讀量。
res1 = BookInfo.objects.aggregate(Sum('bread'))
print(res1)
# 2. 查詢圖書總數。
res_counut = BookInfo.objects.count()
print(res_counut)
res2 = BookInfo.objects.aggregate(Count('id'))
print(res2)
# 3. 對所有圖書按照閱讀量從小到大進行排序。
book1 = BookInfo.objects.order_by('bread')
print(book1)
# 4. 對所有圖書按照閱讀量從大到小進行排序。
book2 = BookInfo.objects.order_by('-bread')
print(book2)