• 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'}]
    
    
    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    递归判断字符串是否为回文
    原码,补码,反码
    Java语言程序设计2019.9.16
    四则运算---根据用户要求输出计算题源代码
    学生成绩管理系统-JAVA语言测试
    暑假生活第八周
    暑假生活第七周
    暑假生活第六周
    POJ 2400 Supervisor, Supervisee(KM二分图最大权值匹配)题解
    POJ 2226 Muddy Fields(最小点覆盖)题解
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12272900.html
Copyright © 2020-2023  润新知