文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

手把手教你用Django执行原生SQL

2024-12-03 11:31

关注

前言

Hey,各位小伙伴,这次怎么来玩一下,如何使用Django执行原生SQL。

我们都知道,Python在web界的扛把子——Django,可谓是集大成为统一,各种各样的插件、forms组件、model模型、Admin后台等等,后面我会专门出文章娓娓道来,反正就是一个字,NB。

本次就来学一下,如何在Django执行原生语句。

起因

在使用Django时,一般情况下,我们使用Django自带的model查询是没有问题的,基本能满足80%的问题

但是,但是,那20%就不要了吗???肯定不行哎,小孩才做选择

在Django执行原生SQL有以下三种方式

一般情况下,就以上三种方式

表结构

文件:django_project/app01/models

  1. class Book(models.Model): 
  2.     title = models.CharField(verbose_name="书名", max_length=32) 
  3.     describe = models.TextField(verbose_name="描述"
  4.     author = models.CharField(verbose_name="作者", max_length=32) 
  5.     publisher = models.CharField(verbose_name="出版社", max_length=32) 
  6.     publisher_date = models.DateField(verbose_name="publisher"

就是一个很简单的图书表

通过admin录入一些数据测试使用

 

extra方式

强烈建议,不用学,没毛用

raw方式

这个相比较extra,还是比较有用的,

语法如下

  1. models.表名.objecs.raw(sql) 
  2. models.表名.objecs.raw(sql,[参数1,参数2]) 

注:如果没有参数,就只写sql语句,如果由参数,后面需要用列表,如图所示

举例

 

返回的仍然一个个的Book对象

真正的原生sql方式

上述的,其实还是和django的model有些绑定。但是我就是说,我就是想要原生sql,不要跟任何绑定。

这里说一下,千万不要在django使用pymysql执行原生sql,会发生一些奇怪的问题。一定要导入from django.db import connection执行sql。代码如下:

  1. from django.db import connection 
  2. def book_list(request): 
  3.     # 真正的原生sql, 
  4.     cursor = connection.cursor() 
  5.     print(type(cursor)) 
  6.     cursor.execute("select * from app01_book where id=%s", [1, ]) 
  7.     raw = cursor.fetchall() 
  8.     print(raw) 

返回内容如下图所示:

 

可以看到,返回的是列表里面套一个个的数组。我就在想,有没有什么办法能将查询出来的sql,直接返回成字典呢?答案是当然可以!

执行原生sql并且返回成dict

我将执行原生sql并且直接返回成字典的方式封装成了两个函数

一个是查询多个,代码如下所示:

  1. def query_all_dict(sql, params=None): 
  2.     ''
  3.     查询所有结果返回字典类型数据 
  4.     :param sql: 
  5.     :param params: 
  6.     :return
  7.     ''
  8.     with connection.cursor() as cursor
  9.         if params: 
  10.             cursor.execute(sql, params=params) 
  11.         else
  12.             cursor.execute(sql) 
  13.         col_names = [desc[0] for desc in cursor.description] 
  14.         row = cursor.fetchall() 
  15.         rowList = [] 
  16.         for list in row: 
  17.             tMap = dict(zip(col_names, list)) 
  18.             rowList.append(tMap) 
  19.         return rowList 

一个是查询一个,代码如下所示:

  1. def query_one_dict(sql, params=None): 
  2.     ""
  3.     查询一个结果返回字典类型数据 
  4.     :param sql: 
  5.     :param params: 
  6.     :return
  7.     ""
  8.     with connection.cursor() as cursor
  9.         if params: 
  10.             cursor.execute(sql, params=params) 
  11.         else
  12.             cursor.execute(sql) 
  13.         col_names = [desc[0] for desc in cursor.description] 
  14.         row = cursor.fetchone() 
  15.         tMap = dict(zip(col_names, row)) 
  16.         return tMap 

用法如下,直接在视图中调用函数

 

返回结果如下,直接是列表套字典格式

 

那查询带条件的怎么办哪,其实和pymysql一个样

 

返回结果

 

但是有个问题,上面的查询,我们明明知道,让只会返回一个值,但是还是返回的是列表套字典格式,似乎不太对呐?

其实上述我写的是两个办法,如果确定就查询一个值,使用query_one_dict方法。

 

上述总结

django中执行原生sql有3种方式,extra,raw,from django.db import connection

其中extra基本没用,raw凑合,但是和models有绑定,connection最灵活,但是默认返回的是[tuple,tuple,tuple,]格式

经过改良,封装出两个方法,query_all_dict,query_one_dict,一个是查询多个,一个是查询单个,并且返回成[dict,dict,dict,]

建议

只使用query_all_dict,query_one_dict

项目代码

  1. django_exec_sql.zip 

需要本文完整代码的小伙伴,可以在本公众号后台回复关键字:原生SQL,进行获取。

总结

上述以入门的方式解决了安排了以下如何通过django执行原生sql。

用微笑告诉别人,今天的我比昨天强,今后也一样。

本文转载自微信公众号「Python爬虫与数据挖掘」,可以通过以下二维码关注。转载本文请联系Python爬虫与数据挖掘公众号。

 

来源:Python爬虫与数据挖掘内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯