1. 程式人生 > 其它 >LVS-keepalived高可用群集案例部署

LVS-keepalived高可用群集案例部署

0 前後端分離和混合開發

1 模板語言:每個語言的web框架都會有模板語言,django---》dtl
2 模板語言的渲染,是再後端完成的

3 用php寫前端(html,css,js)(不對的)

4 前後端分離:前後端互動,統一全用json格式
5 前端只專注於寫前端(vue,react:前端工程化),後端只專注於寫後端(提供介面,互動json格式資料)

1 聚合查詢

###########1 聚合查詢(聚合函式:最大,最小,和,平均,總個數)
from django.db.models import Avg,Max,Min,Count,Sum
#1 計算所有圖書的平均價格
# aggregate結束,已經不是queryset物件了
# book=models.Book.objects.all().aggregate(Avg('price'))
# 起別名
# book=models.Book.objects.all().aggregate(avg=Avg('price'))
#2 計算總圖書數
# book = models.Book.objects.all().aggregate(count=Count('id'))
# 3 計算最低價格的圖書
# book = models.Book.objects.all().aggregate(min=Min('price'))
# 4 計算最大價格圖書
# book = models.Book.objects.all().aggregate(max=Max('price'))
# print(book)

2 分組查詢

 ####2  分組查詢
'''
查詢每一個部門名稱以及對應的員工數
book:
id name price publish
1 金品 11.2 1
2 西遊 14.2 2
3 東遊 16.2 2
4 北郵 19.2 3

'''
# 示例一:查詢每一個出版社id,以及出書平均價格
# select publish_id,avg(price) from app01_book group by publish_id;
# annotate


# annotate() 內寫聚合函式
# values在前表示group by的欄位
# values在後表示取某幾個欄位
# filter在前表示where
# filter在後表示having
# from django.db.models import Avg, Count, Max, Min
# ret=models.Book.objects.values('publish_id').annotate(avg=Avg('price')).values('publish_id','avg')
# print(ret)

# 查詢出版社id大於1的出版社id,以及出書平均價格
#select publish_id,avg(price) from app01_book where publish_id>1 group by publish_id;

# ret=models.Book.objects.values('publish_id').filter(publish_id__gt=1).annotate(avg=Avg('price')).values('publish_id','avg')
# print(ret)

# 查詢出版社id大於1的出版社id,以及出書平均價格大於30的
# select publish_id,avg(price)as aaa from app01_book where publish_id>1 group by publish_id HAVING aaa>30;
# ret = models.Book.objects.values('publish_id').filter(publish_id__gt=1).annotate(avg=Avg('price')).filter(avg__gt=30).values(
# 'publish_id', 'avg')
# print(ret)


## 查詢每一個出版社出版的書籍個數
# pk 代指主鍵

# ret=models.Book.objects.get(pk=1)
# print(ret.name)
# ret=models.Publish.objects.values('pk').annotate(count=Count('book__id')).values('name','count')
# print(ret)
# 如果沒有指定group by的欄位,預設就用基表(Publish)主鍵欄位作為group by的欄位
# ret=models.Publish.objects.annotate(count=Count('book__id')).values('name','count')
# print(ret)

# 另一種方式實現
# ret=models.Book.objects.values('publish').annotate(count=Count('id')).values('publish__name','count')
# print(ret)


#查詢每個作者的名字,以及出版過書籍的最高價格(建議使用分組的表作為基表)
# 如果不用分組的表作為基表,資料不完整可能會出現問題
# ret=models.Author.objects.values('pk').annotate(max=Max('book__price')).values('name','max')

# ret = models.Author.objects.annotate(max=Max('book__price')).values('name', 'max')

# ret= models.Book.objects.values('authors__id').annotate(max=Max('price')).values('authors__name','max')
# print(ret)

#查詢每一個書籍的名稱,以及對應的作者個數

# ret=models.Book.objects.values('pk').annotate(count=Count('authors__id')).values('name','count')
# ret=models.Book.objects.annotate(count=Count('authors__id')).values('name','count')

# ret=models.Author.objects.values('book__id').annotate(count=Count('id')).values('book__name','count')
#
# print(ret)

#統計不止一個作者的圖書
# ret=models.Book.objects.values('pk').annotate(count=Count('authors__id')).filter(count__gt=1).values('name','count')
# ret = models.Author.objects.values('book__id').annotate(count=Count('id')).filter(count__gt=1).values('book__name', 'count')
# print(ret)

# 統計價格數大於10元,作者的圖書
ret = models.Book.objects.values('pk').filter(price__gt=10).annotate(count=Count('authors__id')).values('name',
'count')
print(ret)

#統計價格數大於10元,作者個數大於1的圖書
ret = models.Book.objects.values('pk').filter(price__gt=10).annotate(count=Count('authors__id')).filter(count__gt=1).values('name', 'count')
print(ret)

3 F和Q查詢

 # F查詢:取出資料庫的某個欄位的值

# 把read_num都加1
from django.db.models import F
ret=models.Book.objects.all().update(read_num=F('read_num')+1)
print(ret)


#查詢評論數大於閱讀數的書籍
ret=models.Book.objects.all().filter(commit_num__gt=F('read_num'))
for i in ret:
print(i.name)

## 查詢評論數大於閱讀數2倍的書籍
ret=models.Book.objects.filter(commit_num__gt=F('read_num')*2)
print(ret)


# Q查詢:製造 與或非的條件

# Q查詢:製造 與或非的條件
# 查詢名字叫egon或者價格大於100的書
from django.db.models import Q
# ret=models.Book.objects.filter(Q(name='egon') | Q(price__gt=100))
# 查詢名字叫egon並且價格大於100的書
# ret=models.Book.objects.filter(Q(name='egon') & Q(price__gt=100))
# ret=models.Book.objects.filter(name='egon',price__gt=100)


# 查詢名字不為egon的書
# ret = models.Book.objects.filter(~Q(name='egon'))
# print(ret)

# Q可以巢狀
ret = models.Book.objects.filter((Q(name='egon') & Q(price__lt=100)) | Q(id__lt=3))
print(ret)

4 原生sql

  # 原生sql(有些sql用orm寫不出來)
# 兩種方案
# 第一種:用的比較少

# from django.db import connection
#
# cursor = connection.cursor()
#
# cursor.execute("""SELECT * from app01_book where id = %s""", [1])
#
# # row = cursor.fetchone()
# row = cursor.fetchall()
# print(row)

# 第二種,用的多
# books=models.Book.objects.raw('select * from app01_book where id >3')
# print(books)#RawQuerySet物件
# for book in books:
# print(book.name)

# books=models.Book.objects.raw('select * from app01_publish')
# for book in books:
# print(book.__dict__)
# print(book.name)
# print(book.addr)
# print(book.email)
# print(book.price)

# authors = models.Author.objects.raw('SELECT app01_author.id,app01_author. NAME,app01_authordetail.sex FROM app01_author JOIN app01_authordetail ON app01_author.author_detail_id = app01_authordetail.id WHERE app01_authordetail.sex = 1')
#
# for author in authors:
# print(author.name)
# print(author.__dict__)

5 defer和only

  # defer和only(查詢優化相關)
# only保持是book物件,但是隻能使用only指定的欄位
# books = models.Book.objects.all().only('name')
# print(books[0].name)
# print(books[0].price) # 能出來,

# books = models.Book.objects.all().only('name')
#
# print(books[0].__dict__)
books = models.Book.objects.all().defer('name','price')
print(books[0].__dict__)

6 事務(請求,裝飾器,區域性)

# 事物:ACID,事物的隔離級別(搜),鎖, 行級鎖,表級鎖

# djanog orm中使用事物:原子性操作,要麼都成功,要麼都失敗

# 新增一個作者詳情,新增一個作者

# 事物的三個粒度
# 1 區域性使用
from django.db import transaction
with transaction.atomic(): # 都在事物中,要麼都成功,要麼都失敗
author_detail=models.AuthorDetail.objects.create(addr='xxx',phone='123',sex=1)
# raise Exception('拋了異常')
author=models.Author.objects.create(name='llqz',age=19,author_detail=author_detail)
# 2 檢視函式裝飾器,這一個檢視函式都在一個事物中
# @transaction.atomic
# def index(request):
# return HttpResponse('ok')


# 3 整個http請求,在事物中,在setting.py中配置
'''
DATABASES = {
'default': {
...
'PORT': 3306,
'ATOMIC_REQUEST': True,

}
}

'ATOMIC_REQUEST': True,
設定為True統一個http請求對應的所有sql都放在一個事務中執行(要麼所有都成功,要麼所有都失敗)。

'''