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

问题:
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";

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容