zoukankan      html  css  js  c++  java
  • 93.QuerySet转换为SQL的条件:迭代,切片(指定步长),len函数,list函数,判断

    生成一个QuerySet对象并不会马上转换为SQL语句去执行。

    books = Book.objects.filter(pk=3)
    print(connection.queries)
    

    打印出django底层执行的sql语句:是一个空的列表[]

    在以下情况下QuerySet会被转换为SQL语句执行:
    1. 迭代:在遍历QuerySet对象的时候,会执行这个sql语句,然后再把执行的结果返回进行迭代,比如,以下代码:
    def index(request):
        books = Book.objects.all()
        for book in books:
            print(book)
        print(connection.queries)
        return HttpResponse('SUCCESS')
    

    此时就会返回django底层执行的sql语句:

    [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, 
    {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, 
    {'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, `book`.`score` FROM `book`', 'time': '0.000'}]
    
    
    2. 使用步长做切片操作,QuerySet可以类似于列表一样做切片操作,但是在做切的操作时本身并不会执行sql语句,如果在做切片操作的时候提供了步长,那么就会执行sql语句,需要注意的是在做切片之后不能再做filter操作,否者的话就会报错。示例代码如下:
    # 在做切片操作的时候【start,end,步长】,注意:不包括end位置的数据
        books = Book.objects.all()[0:6:2]
        for book in books:
            print(book)
        print(connection.queries)
        return HttpResponse('SUCCESS')
    

    返回的结果如下:

    # 每两条数据去一条
    Book object (1)
    Book object (3)
    Book object (5)
    [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, 
    {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.016'}, 
    {'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, `book`.`score` FROM `book` LIMIT 6', 'time': '0.000'}]
    
    3. 调用len()函数:调用len函数用来获取QuerySet中共有多少条数据也会执行sql语句。
    def index(request):
        # 调用len函数
        books = Book.objects.filter(bookorder__price__gt=90)
        print(len(books))
        print(connection.queries)
        return HttpResponse('SUCCESS')
    

    执行的结果如下:

    1
    [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, 
    {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, 
    {'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, `book`.`score` FROM `book` INNER JOIN `book_order` ON (`book`.`id` = `book_order`.`book_id`) WHERE `book_order`.`price` > 90.0e0', 'time': '0.000'}]
    
    
    4. 调用list函数:调用list函数用来将一个QuerySet对象转化为list对象也会立马执行sql语句。示例代码如下:
    def index(request):
        books = Book.objects.all()
        print(list(books))
        print(connection.queries)
        return HttpResponse('SUCCESS')
    
    [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, 
    {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, 
    {'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, `book`.`score` FROM `book`', 'time': '0.000'}]
    
    
    5. 判断:如果对某个QuerySet进行判断,也会立马执行sql语句,示例代码如下:
    def index(request):
        books = Book.objects.filter(bookorder__price__gte=90)
        if books:
            for book in books:
                print(book)
        print(connection.queries)
        return HttpResponse('SUCCESS')
    

    打印出结果:

    Book object (2)
    [07/Feb/2020 13:56:18] "GET / HTTP/1.1" 200 7
    [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, 
    {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, 
    {'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, `book`.`score` FROM `book` INNER JOIN `book_order` ON (`book`.`id` = `book_order`.`book_id`) WHERE `book_order`.`price` >= 90.0e0', 'time': '0.000'}]
    
    
    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    dubbo入门(一)
    java中文件操作《一》
    Unity 游戏框架搭建 2019 (七) 自定义快捷键
    凉鞋:我所理解的框架 【Unity 游戏框架搭建】
    Unity 游戏框架搭建 2019 (六) MenuItem 复用
    Unity 游戏框架搭建 2019 (五) 打开所在文件夹
    Unity 游戏框架搭建 2019 (四) 导出 UnityPackage
    Unity 游戏框架搭建 2019 (三) 生成文件名到剪切板
    Unity 游戏框架搭建 2019 (二) 文本复制到剪切板
    Unity 游戏框架搭建 2019 (一) 简介与第一个示例文件名的生成
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12272900.html
Copyright © 2011-2022 走看看