Django 數據庫

###Django 數據庫
####1.1 ORM框架
O是object,也就類對象的意思,R是relation,翻譯成中⽂是關係,也就是關係數據庫中數據表的意思,M是 mapping,是映射的意思。在ORM框架中,它幫我們把類和數據表進⾏了⼀個映射,可以讓我們通過類和類對象 就能操作它所對應的表格中的數據。ORM框架還有⼀個功能,它可以根據我們設計的類⾃動幫我們⽣成數據庫中 的表格,省去了我們⾃⼰建表的過程。
####1.2django進行數據庫開發的步驟

  1. 配置數據庫連接信息

  2. 在models.py中定義模型類

  3. 遷移

  4. 通過類和對象完成數據增刪改查操作
    #####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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章