1. 程式人生 > >python專案篇-複習分組和聚合

python專案篇-複習分組和聚合

1. 複習下分組和聚合 

	1. 分組
		ORM中values或者values_list 裡面寫什麼欄位,就相當於select 什麼欄位
		
		ret = models.Employee.objects.all().values("dept", "age")
		相當於:
		SELECT `employee`.`dept`, `employee`.`age` FROM `employee` LIMIT 21; args=()
		
	2. ORM中 annotate 前面是什麼就按照什麼分組!
		from django.db.models import Avg
		ret = models.Employee.objects.values("province").annotate(a=Avg("salary")).values("province", "a")
		相當於:
		SELECT `employee`.`province`, AVG(`employee`.`salary`) AS `a` FROM `employee` GROUP BY `employee`.`province` ORDER BY NULL LIMIT 21; args=()

	3. extra  --> 在執行ORM查詢的時候執行額外的SQL語句
		# 查詢person表,判斷每個人的工資是否大於2000
		ret = models.Person.objects.all().extra(
		    select={"gt": "salary > 2000"}
		)
		相當於:
		SELECT (salary > 2000) AS `gt`, `person`.`id`, `person`.`name`, `person`.`salary`, `person`.`dept_id` FROM `person` LIMIT 21; args=()


	4. 直接執行原生的SQL語句,類似pymysql的用法
		from django.db import connection
		cursor = connection.cursor()  # 獲取游標,等待執行SQL語句
		cursor.execute("""SELECT * from person where id = %s""", [1])
		row = cursor.fetchone()
		print(row)
		


2. 個人站點首頁
	- 分組和聚合查詢
		1. 文章分類
		2. 標籤分類
	
		3. 日期歸檔
			1. MySQL內建的方法:date_format(欄位名, "%Y-%m")  
			2. extra() --> 執行額外的原生SQL語句
				ret = models.Article.objects.filter(user=user).extra(
					select={"archive_ym": "date_format(create_time,'%%Y-%%m')"}
				).values("archive_ym").annotate(c=Count("nid")).values("archive_ym", "c")