美文网首页
在django中如何查看orm转换成的sql语句

在django中如何查看orm转换成的sql语句

作者: 叶叶阿姨 | 来源:发表于2020-01-08 15:37 被阅读0次

    问题:
    django的ORM语句和原生sql语句大相径庭,在项目开发中如何确保写的ORM语句与自己想要的sql语句师一直的呢???

    解决方案:
    方案1:
    当是查询语句且查询结果是QuerySet对象时,可以使用QuerySet的query属性查看转化成的sql语句,如下:

    newses = NewsModel.objects.select_related('category','author').all()[0:2]
    print(newses.query)
    print('---'*25)
    print(NewsModel.objects.all().query)
    print('---'*25)
    print(NewsModel.objects.filter(id__gt=2)[3:5].query)
    
    # 打印结果:
    SELECT `news_newsmodel`.`id`, `news_newsmodel`.`title`, `news_newsmodel`.`desc`, `news_newsmodel`.`thumbnail`, `news_newsmodel`.`publish_time`, `news_newsmodel`.`content`, `news_newsmodel`.`category_id`, `news_newsmodel`.`author_id`, `cms_newscategorymodels`.`id`, `cms_newscategorymodels`.`name`, `authPro_user`.`id`, `authPro_user`.`password`, `authPro_user`.`last_login`, `authPro_user`.`is_superuser`, `authPro_user`.`telephone`, `authPro_user`.`username`, `authPro_user`.`email`, `authPro_user`.`is_active`, `authPro_user`.`gender`, `authPro_user`.`date_joined`, `authPro_user`.`is_staff` FROM `news_newsmodel` LEFT OUTER JOIN `cms_newscategorymodels` ON (`news_newsmodel`.`category_id` = `cms_newscategorymodels`.`id`) LEFT OUTER JOIN `authPro_user` ON (`news_newsmodel`.`author_id` = `authPro_user`.`id`) ORDER BY `news_newsmodel`.`publish_time` DESC  LIMIT 2
    ---------------------------------------------------------------------------
    SELECT `news_newsmodel`.`id`, `news_newsmodel`.`title`, `news_newsmodel`.`desc`, `news_newsmodel`.`thumbnail`, `news_newsmodel`.`publish_time`, `news_newsmodel`.`content`, `news_newsmodel`.`category_id`, `news_newsmodel`.`author_id` FROM `news_newsmodel` ORDER BY `news_newsmodel`.`publish_time` DESC
    ---------------------------------------------------------------------------
    SELECT `news_newsmodel`.`id`, `news_newsmodel`.`title`, `news_newsmodel`.`desc`, `news_newsmodel`.`thumbnail`, `news_newsmodel`.`publish_time`, `news_newsmodel`.`content`, `news_newsmodel`.`category_id`, `news_newsmodel`.`author_id` FROM `news_newsmodel` WHERE `news_newsmodel`.`id` > 2 ORDER BY `news_newsmodel`.`publish_time` DESC  LIMIT 2 OFFSET 3
    

    方案2:
    直接在项目中使用原生sql语句对数据库进行操作,python借助pymysql模块操作mysql的简单流程如下:

    # 导入pymysql模块
    import pymysql
    
    #定义配置信息(字典形式)
    db_config = {
      'host' : '127.0.0.1',
      'user' : 'xxx',      #数据库连接用户
      'password' : 'xxx',    #数据库连接密码
      'db' : 'tan'      #数据库名
    }
    
    
    # 建立连接
    conn = pymysql.connect(**db_config)
    # 建立游标
    cursor = conn.cursor()
    
    # 执行sql语句:  cursor.excute("原生sql语句")  注意:此处的原生sql语句结尾不用加;
    cursor.excute("select * from students")
    #获取数据(列表形式),此处需主动获取数据
    values = cursor.fetchall()
    # 打印数据
    for value in values:
          print(value)
    
    #提交操作
    conn.commit()
    #游标关闭
    cursor.close()
    #连接关闭
    conn.close()
    

    方案3:
    django框架采用的ORM模型,我们可以通过mysql的日志记录实时查看执行的sql语句,具体步骤如下:

    第一步:进入mysql,查看日志开启的状态和log文件路径;

    mysql>  show variables like "%general_log%";
    +------------------+-------------------------+
    | Variable_name    | Value                   |
    +-------------------+------------------------+
    | general_log      | OFF                     |
    | general_log_file | /var/lib/mysql/VIP.log  |
    +------------------+-------------------------+
    2 rows in set (0.00 sec)
    

    第二步:如上操作,OFF说明没有开启日志记录,我们可以通过如下命令设置日志启动状态 or 更改日志路径和日志名;

    mysql> set global general_log_file = '/var/lib/mysql/localhost.log';
    
    mysql> set global general_log = 'ON';
    
    mysql>  show variables like "%general_log%";
    +------------------+------------------------------+
    | Variable_name    | Value                        |
    +------------------+------------------------------+
    | general_log      | ON                           |
    | general_log_file | /var/lib/mysql/localhost.log |
    +------------------+------------------------------+
    2 rows in set (0.00 sec)
    
    

    !!!注意:
    日志开启后,所有执行的sql都会被记录下来,但是如果重启mysql就会停止记录,即general_log的值变回OFF!

    /****** 更改general_log='ON'后若重启mysql服务  *****/
    
    # 重启mysql服务
    service mysql restart
    
    # 进入mysql再次查看日志状态,general_log再次变为OFF
    mysql>  show variables like "%general_log%";
    +------------------+------------------------+
    | Variable_name    | Value                  |
    +------------------+------------------------+
    | general_log      | OFF                    |
    | general_log_file | /var/lib/mysql/VIP.log |
    +------------------+------------------------+
    2 rows in set (0.00 sec)
    

    拓展:
    mysql数据库支持两种日志存储方式:文件(file) and 数据表(table)

    
    # 查询mysql日志存储方式
    mysql> show variables like "%log_output%";
    
    # 设置mysql日志存储方式:文件存储方式(默认方式)
    set global log_output = "FILE";
    
    # 设置mysql日志存储方式:数据表存储方式
    set global log_output = "TABLE";
    
    # 设置mysql日志存储方式:文件和数据表同时存储日志
    set global log_output = "TABLE,FILE";
    

    以上方法也只是让你看思路的一种 具体的还是要自己做一些优化,反正这个是在百度上看到的 感觉比较好玩 可以看看

    相关文章

      网友评论

          本文标题:在django中如何查看orm转换成的sql语句

          本文链接:https://www.haomeiwen.com/subject/smdsactx.html