电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Django QuerySet查詢集原理及代碼實例

瀏覽:171日期:2024-09-29 11:05:17

一 概念

Django的ORM中存在查詢集的概念。

查詢集,也稱查詢結(jié)果集、QuerySet,表示從數(shù)據(jù)庫中獲取的對象集合。

當調(diào)用如下過濾器方法時,Django會返回查詢集(而不是簡單的列表):

all():返回所有數(shù)據(jù)。 filter():返回滿足條件的數(shù)據(jù)。 exclude():返回滿足條件之外的數(shù)據(jù)。 order_by():對結(jié)果進行排序。

對查詢集可以再次調(diào)用過濾器進行過濾,也就意味著查詢集可以含有零個、一個或多個過濾器。過濾器基于所給的參數(shù)限制查詢的結(jié)果。

從SQL的角度講,查詢集與select語句等價,過濾器像where、limit、order by子句。

二 兩大特性

1)惰性執(zhí)行

創(chuàng)建查詢集不會訪問數(shù)據(jù)庫,直到調(diào)用數(shù)據(jù)時,才會訪問數(shù)據(jù)庫,調(diào)用數(shù)據(jù)的情況包括迭代、序列化、與if合用

例如,當執(zhí)行如下語句時,并未進行數(shù)據(jù)庫查詢,只是創(chuàng)建了一個查詢集qs

# 查詢BookInfo模型類中的所有數(shù)據(jù)qs = BookInfo.objects.all() # 繼續(xù)執(zhí)行遍歷迭代操作后,才真正的進行了數(shù)據(jù)庫的查詢for book in qs: print(book.btitle)

2)緩存

使用同一個查詢集,第一次使用時會發(fā)生數(shù)據(jù)庫的查詢,然后Django會把結(jié)果緩存下來,再次使用這個查詢集時會使用緩存的數(shù)據(jù),減少了數(shù)據(jù)庫的查詢次數(shù)。

情況一:如下是兩個查詢集,無法重用緩存,每次查詢都會與數(shù)據(jù)庫進行一次交互,增加了數(shù)據(jù)庫的負載。

from booktest.models import BookInfo# 每個列表內(nèi)都為一個獨立的查詢集,兩次查詢集之間如果有數(shù)據(jù)插入,可能數(shù)據(jù)集會不同[book.id for book in BookInfo.objects.all()]

[book.id for book in BookInfo.objects.all()]

情況二:經(jīng)過存儲后,可以重用查詢集,第二次使用緩存中的數(shù)據(jù)。

# 首先獲得一個查詢集qs=BookInfo.objects.all()# 第一次讀取數(shù)據(jù),會查詢數(shù)據(jù)庫,然后增加緩存[book.id for book in qs]# 第二次讀取數(shù)據(jù),直接查詢緩存[book.id for book in qs]

3)何時查詢集不會被緩存?

查詢集不會永遠緩存它們的結(jié)果。當只對查詢集的部分進行求值時會檢查緩存, 如果這個部分不在緩存中,那么接下來查詢返回的記錄都將不會被緩存。所以,這意味著使用切片或索引來限制查詢集將不會填充緩存。

情況一:重復獲取查詢集對象中一個特定的索引將每次都查詢數(shù)據(jù)庫:

queryset = BookInfo.objects.all()

queryset[5] # 查詢數(shù)據(jù)庫queryset[5] # 再一次查詢數(shù)據(jù)庫

情況二:如果已經(jīng)對全部查詢集求值過,則將檢查緩存:

# 獲取查詢集queryset = BookInfo.objects.all()[entry for entry in queryset] # 查詢數(shù)據(jù)庫print queryset[5] # 使用緩存 print queryset[5] # 使用緩存

情況三:下面是一些其它例子,它們會使得全部的查詢集被求值并填充到緩存中:

# 獲取查詢集queryset = BookInfo.objects.all()[entry for entry in queryset]bool(queryset)entry in querysetlist(queryset)

注:簡單地打印查詢集不會填充緩存。

queryResult=models.Article.objects.all()print(queryResult) # 查詢數(shù)據(jù)庫print(queryResult) # 查詢數(shù)據(jù)庫 

三 限制查詢集

1)、可以對查詢集進行取下標或切片操作,等同于sql中的limit和offset子句。

注意:不支持負數(shù)索引。對查詢集進行切片后返回一個新的查詢集,不會立即執(zhí)行查詢。

如果獲取一個對象,直接使用[0],等同于[0:1].get(),但是如果沒有數(shù)據(jù),[0]引發(fā)IndexError異常,[0:1].get()如果沒有數(shù)據(jù)引發(fā)DoesNotExist異常。

示例:獲取第1、2項,運行查看。

qs = BookInfo.objects.all()[0:2]

2)、exists()方法:判斷某一個查詢集中是否有數(shù)據(jù):

簡單的使用if語句進行判斷也會完全執(zhí)行整個queryset并且把數(shù)據(jù)放入cache,雖然你并不需要這些 數(shù)據(jù)!為了避免這個,可以用exists()方法,判斷查詢集中是否有數(shù)據(jù),如果有則返回True,沒有則返回False。

if queryResult.exists():#SELECT (1) AS 'a' FROM 'blog_article' LIMIT 1; args=()print('exists...')

3)、terator()方法: 來獲取數(shù)據(jù),處理完數(shù)據(jù)就將其丟棄。

當queryset非常巨大時,cache會成為問題。

處理成千上萬的記錄時,將它們一次裝入內(nèi)存是很浪費的。更糟糕的是,巨大的queryset可能會鎖住系統(tǒng) 進程,讓你的程序瀕臨崩潰。要避免在遍歷數(shù)據(jù)的同時產(chǎn)生queryset cache,可以使用iterator()方法 來獲取數(shù)據(jù),處理完數(shù)據(jù)就將其丟棄。

objs = BookInfo.objects.all().iterator()# iterator()可以一次只從數(shù)據(jù)庫獲取少量數(shù)據(jù),這樣可以節(jié)省內(nèi)存for obj in objs: print(obj.title)#BUT,再次遍歷沒有打印,因為迭代器已經(jīng)在上一次遍歷(next)到最后一次了,沒得遍歷了for obj in objs: print(obj.title)

注:(1) 使用iterator()方法來防止生成cache,意味著遍歷同一個queryset時會重復執(zhí)行查詢。所以使 #用iterator()的時候要當心,確保你的代碼在操作一個大的queryset時沒有重復執(zhí)行查詢。

(2) queryset的cache是用于減少程序?qū)?shù)據(jù)庫的查詢,在通常的使用下會保證只有在需要的時候才會查詢數(shù)據(jù)庫。 使用exists()和iterator()方法可以優(yōu)化程序?qū)?nèi)存的使用。不過,由于它們并不會生成queryset cache,可能 會造成額外的數(shù)據(jù)庫查詢。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Django
相關文章:
主站蜘蛛池模板: 光伏家 - 太阳能光伏发电_分布式光伏发电_太阳能光伏网 | 西安耀程造价培训机构_工程预算实训_广联达实作实操培训 | 淬火设备-钎焊机-熔炼炉-中频炉-锻造炉-感应加热电源-退火机-热处理设备-优造节能 | 河南生物显微镜,全自动冰冻切片机-河南荣程联合科技有限公司 | SMC-SMC电磁阀-日本SMC气缸-SMC气动元件展示网 | 制氮设备-变压吸附制氮设备-制氧设备-杭州聚贤气体设备制造有限公司 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | 巨野月嫂-家政公司-巨野县红墙安康母婴护理中心| 国产液相色谱仪-超高效液相色谱仪厂家-上海伍丰科学仪器有限公司 | 万博士范文网-您身边的范文参考网站Vanbs.com | 江西自考网| 风电变桨伺服驱动器-风电偏航变桨系统-深圳众城卓越科技有限公司 | 废气处理设备-工业除尘器-RTO-RCO-蓄热式焚烧炉厂家-江苏天达环保设备有限公司 | 医养体检包_公卫随访箱_慢病随访包_家签随访包_随访一体机-济南易享医疗科技有限公司 | 厌氧工作站-通用型厌氧工作站-上海胜秋科学仪器有限公司 | 苏州注册公司_苏州代理记账_苏州工商注册_苏州代办公司-恒佳财税 | 自动售货机_无人售货机_专业的自动售货机运营商_免费投放售货机-广州富宏主官网 | 耐酸碱泵-自吸耐酸碱泵型号「品牌厂家」立式耐酸碱泵价格-昆山国宝过滤机有限公司首页 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 热风机_工业热风机生产厂家上海冠顶公司提供专业热风机图片价格实惠 | 纯水设备_苏州皙全超纯水设备水处理设备生产厂家 | 找果网 | 苹果手机找回方法,苹果iPhone手机丢了找回,认准找果网! | 螺旋绞龙叶片,螺旋输送机厂家,山东螺旋输送机-淄博长江机械制造有限公司 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 南京PVC快速门厂家南京快速卷帘门_南京pvc快速门_世界500强企业国内供应商_南京美高门业 | 一体化污水处理设备_生活污水处理设备_全自动加药装置厂家-明基环保 | 成都装修公司-成都装修设计公司推荐-成都朗煜装饰公司 | 甲级防雷检测仪-乙级防雷检测仪厂家-上海胜绪电气有限公司 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 大白菜官网,大白菜winpe,大白菜U盘装系统, u盘启动盘制作工具 | 【官网】博莱特空压机,永磁变频空压机,螺杆空压机-欧能优 | 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 | 广东燎了网络科技有限公司官网-网站建设-珠海网络推广-高端营销型外贸网站建设-珠海专业h5建站公司「了了网」 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | 识禅_对禅的了解,从这里开始 | 卷筒电缆-拖链电缆-特种柔性扁平电缆定制厂家「上海缆胜」 | 安全阀_弹簧式安全阀_美标安全阀_工业冷冻安全阀厂家-中国·阿司米阀门有限公司 | 硅胶管挤出机厂家_硅胶挤出机生产线_硅胶条挤出机_臣泽智能装备 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 塑料瓶罐_食品塑料瓶_保健品塑料瓶_调味品塑料瓶–东莞市富慷塑料制品有限公司 | 电机铸铝配件_汽车压铸铝合金件_发动机压铸件_青岛颖圣赫机械有限公司 | 翰香原枣子坊加盟费多少钱-正宗枣核糕配方培训利润高飘香 |