zoukankan      html  css  js  c++  java
  • Django中的聚合/分组查询/F/Q查询/orm执行原生sql语句/ ORM事务和锁

    前言

    前言:北京生活好累,想把房子卖了带上自己喜欢的菇凉一起去旅游,可是房东不愿意啊,所以还是学Django吧
    
    聚合查询
    aggreate聚合查询,结果是普通字典,queryset的结束符
    from django.db.models import Avg,Max,Min,Count,Sum
    
    求出孩子中间岁数最大的是谁
    obj=models.Children.objects.all().aggreate(a=max('age'))
    print(obj)
    '结果':
      4
    Children.objects.aggregate(Avg('age'), Max('age'), Min('age'))   
    
    
    分组查询
    '分组查询: group by app01_children.wifes_id
    每个妻子生的最大的孩子
    方式一:
      ret=models.Children.objects.values(childs_id).annotate(m=Max('age'))
    总结: values写在annotate前面,意思是以values括号内的字段作为分组的依据,annotate里面是你要做的统计结果,
      这样,返回结果为queryset类型数据,里面是字典{'childs_id':1,'m':3}
    
    方式二:
      ret=models.Wife.objects.annotate(m=Max('children__age').values('m','name')
    总结:annotate直接写下了objects后面,意思是按照前面表的所有数据(默认是id值)作为分组数据,结果返回的是前面这个表的所有models对象(model对象中包含了每个对象自己的统计结果),在通过values来取值,取值时可以直接写字段和统计结果的别名,也是queryset类型,里面是字典{'m':1,'name':'熊一'}
                                       
    放过胡斌  就来个图书馆管理系统吧
                                       
    models.Book.objects.values('authors__name','authors__id').annotate(m=Max('price'))  # group by authors__name,authors__id
        print(ret)
    
        ret = models.Author.objects.annotate(m=Max('book__price')).values('name','m')
        print(ret)
    
    
    F查询
    查询结果是本表中两个字段的比较滞后符合条件的结果集
    查询一下点赞数大于评论数的所有书籍
    list1=[]
    books=models.Book.objects.all()
    for i in books:
      if i.dianzan > i.comment:
        list1.append(i)
        
        
    ret=models.Book.objects.filiter(dianzan__gt=F('comment')).values('title')   '大于'
     ret = models.Book.objects.filter(dianzan__lt=F('comment')).values('title')   '小于
    
    Q查询
       # 查询一下点赞大于300或者价钱小于300的书,Q的连接符:& -- and,  |--or,~ -- not 取反
        # ret = models.Book.objects.filter(Q(dianzan__gt=300)|~Q(price__lt=500),xx='oo').values('title')
        ret = models.Book.objects.filter(Q(dianzan__gt=300)).values('title')
        # 
        # ret = models.Book.objects.filter(Q(Q(dianzan__gt=300)|~Q(price__lt=500))&Q(xx='oo')).values('title')
        # print(ret)
        
    
    Q查询能够进行各种复杂条件的拼接
    
    
    
    orm执行原生sql语句(了解)
        # 方式1
        # ret = models.Book.objects.raw('select * from app01_book;')
        # for i in ret:
        #     print(i.title)
        # print(ret)
        
        #方式2 django自带的连接通道(配置的pymysql)
        from django.db import connection
        import pymysql
        # conn = pymysq.connect()
        # cursor = connection.cursor()
        # cursor.execute('select * from app01_book;')
        # print(cursor.fetchall())
        #
        
        # 方式3 pymysql
        # conn = pymysql.connect(
        #     host='127.0.0.1',
        #     port=3306,
        #     user='root',
        #     password='123',
        #     database='orm02',
        #     charset='utf8'
        # 
        # )
        # cursor = conn.cursor(pymysql.cursors.DictCursor)
        # cursor.execute('select * from app01_book;')
        # print(cursor.fetchall())
    
    ORM事务和锁
    锁:
    	models.Book.objects.select_for_update().filter(id=1)
    
    事务:
    方式1 全局配置
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'mxshop',
            'HOST': '127.0.0.1',
            'PORT': '3306',
            'USER': 'root',
            'PASSWORD': '123',
            "ATOMIC_REQUESTS": True, #全局开启事务,绑定的是http请求响应整个过程当中的sql
        }
    }
    
    
    方式2: 视图函数加装饰器
    	from django.db import transaction
        @transaction.atomic
        def viewfunc(request):
            # This code executes inside a transaction.
            do_stuff()
    方式3: 上下文加装饰器
    	from django.db import transaction
        def viewfunc(request):
            # This code executes in autocommit mode (Django's default).
            do_stuff()
    
            with transaction.atomic():   #保存点
                # This code executes inside a transaction.
                do_more_stuff()
    
            do_other_stuff()
    
  • 相关阅读:
    终止线程的三种方法
    spring bean scope 的几种类型
    耦合(软件工程)
    标签防止重复提交
    Struts2中的ognl标签
    struts2
    SQL PRIMARY KEY 约束:使用方法及撤销办法解析
    SQL UNIQUE 约束:使用方法及撤销办法剖析
    SQL NOT NULL 约束:语法及案例剖析
    SQL 约束(Constraints):语法及实例剖析
  • 原文地址:https://www.cnblogs.com/x-h-15029451788/p/11931307.html
Copyright © 2011-2022 走看看