zoukankan      html  css  js  c++  java
  • ORM其它查询

    F查询和Q查询

      当一般的查询已经无法满足我们的需求时,Django为我们提供了F和Q查询的复杂语句。假如,对数据库中所有人的年龄加一岁,该怎样查询?

      F查询

        F查询专门对对象中某列值的操作,不可使用_双下划线!

      Q查询

        Q()可以使orm的fifter()方法支持, 多个查询条件,使用逻辑关系(&、|、~)包含、组合到一起进行多条件查询

        Q查询可以组合使用“&”,“|”操作符,当一个操作符是用两个Q的对象,他产生了一个新的Q对象,Q对象可以用“~”操作符放在前面表示否定

        也可允许否定与不否定形式的组合。Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。

        语法:

          fifter(Q(查询条件1)| Q(查询条件2))

          fifter(Q(查询条件2)& Q(查询条件3))

          fifter(Q(查询条件4)& ~Q(查询条件5))

          fifter(Q(查询条件6)| Q(Q(查询条件4)& ~ Q(Q(查询条件5)& Q(查询条件3)))包含

        Q查询和非Q查询条件混合使用注意,不包括Q()的查询条件一点要放在Q(查询条件)后面

    分组和聚合查询

        1、aggregate(*args,**kwargs)  聚合函数

           通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合。

        2、annotate(*args,**kwargs)  分组函数

      extra

        extra针对的是复杂的SQL语句

        select select_params   

          1 v = models.UserInfo.objects.all().extra(select={
          2         'n': "select count(1) from app01_userinfo WHERE id>%s"
          3     },
          4     select_params=[1,]   # 有多个% 内部就有多个参数
          5     )
          6     print(v)
          7     for item in v:
          8         print(item.id,item.name,item.n)  # 这里使用n

        where params  

          1 models.UserInfo.objects.extra(
          2         where=["id=1","name='aaa'"]
          3     )
          4     models.UserInfo.objects.extra(
          5         where=["id=1 or id=%s ","name=%s"],
          6         params=[1,"aaa"]
          7     )

        tables

          1 models.UserInfo.objects.extra(
          2         tables=['app01_usertype'],
          3     )
          4 # """select * from app01_userinfo,app01_usertype"""
        总结:
           1 # a. 映射
           2     # select 
           3     # select_params=None
           4     # select 此处 from 表
           5 
           6 # b. 条件
           7     # where=None
           8     # params=None,
           9     # select * from 表 where 此处
          10 
          11 # c. 表
          12     # tables
          13     # select * from 表,此处
          14     
          15 # c. 排序
          16     # order_by=None
          17     # select * from 表 order by 此处
      原生SQL
        Django内部提供了写原生SQL的方法
         在setting中配置
         connection.cursor()默认是default数据
         cursor=connection['db2'].cursor()可以定义自己的数据库
            1 from django.db import connection, connections
            2 
            3 cursor = connection.cursor() #默认 connection=default数据库
            4 cursor = connections['db2'].cursor()
            5 
            6 cursor.execute("""SELECT * from auth_user where id = %s""", [1])# 写原生SQL
            7 
            8 row = cursor.fetchone()
            9 row = cursor.fetchall()  
     
          

        

        

  • 相关阅读:
    揭秘 HashMap 实现原理(Java 8)
    并发容器之写时拷贝的 List 和 Set
    Maven 整合 SSH 框架
    Hibernate框架学习之注解配置关系映射
    Hibernate框架学习之注解映射实体类
    单用户,多设备登录问题
    ios scrollview button 延时点击问题
    Android 的 AlarmManager 和 wakeLock联合使用
    ios bitcode 机制对 dsym 调试文件的影响
    信息类型的异步更新方法
  • 原文地址:https://www.cnblogs.com/jacky912/p/10450854.html
Copyright © 2011-2022 走看看