手把手教你用Django执行原生SQL的方法


Posted in Python onFebruary 18, 2021

前言

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

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

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

起因

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

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

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

  • extra
  • raw
  • django connection

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

表结构

文件:django_project/app01/models

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

就是一个很简单的图书表

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

手把手教你用Django执行原生SQL的方法

extra方式

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

raw方式

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

语法如下

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

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

举例

手把手教你用Django执行原生SQL的方法

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

真正的原生sql方式

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

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

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

返回内容如下图所示:

手把手教你用Django执行原生SQL的方法

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

执行原生sql并且返回成dict

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

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

def query_all_dict(sql, params=None): 
  ''' 
  查询所有结果返回字典类型数据 
  :param sql: 
  :param params: 
  :return: 
  ''' 
  with connection.cursor() as cursor: 
    if params: 
      cursor.execute(sql, params=params) 
    else: 
      cursor.execute(sql) 
    col_names = [desc[0] for desc in cursor.description] 
    row = cursor.fetchall() 
    rowList = [] 
    for list in row: 
      tMap = dict(zip(col_names, list)) 
      rowList.append(tMap) 
    return rowList

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

def query_one_dict(sql, params=None): 
  """ 
  查询一个结果返回字典类型数据 
  :param sql: 
  :param params: 
  :return: 
  """ 
  with connection.cursor() as cursor: 
    if params: 
      cursor.execute(sql, params=params) 
    else: 
      cursor.execute(sql) 
    col_names = [desc[0] for desc in cursor.description] 
    row = cursor.fetchone() 
    tMap = dict(zip(col_names, row)) 
    return tMap

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

手把手教你用Django执行原生SQL的方法

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

手把手教你用Django执行原生SQL的方法

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

手把手教你用Django执行原生SQL的方法

返回结果

手把手教你用Django执行原生SQL的方法

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

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

手把手教你用Django执行原生SQL的方法

手把手教你用Django执行原生SQL的方法

上述总结

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

项目代码

django_exec_sql.zip

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

总结

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

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

到此这篇关于手把手教你用Django执行原生SQL的方法的文章就介绍到这了,更多相关Django执行原生SQL内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中的hashlib和base64加密模块使用实例
Sep 02 Python
Python json 错误xx is not JSON serializable解决办法
Mar 15 Python
K-means聚类算法介绍与利用python实现的代码示例
Nov 13 Python
解决Python2.7读写文件中的中文乱码问题
Apr 12 Python
python批量修改文件夹及其子文件夹下的文件内容
Mar 15 Python
Python爬虫运用正则表达式的方法和优缺点
Aug 25 Python
Python序列对象与String类型内置方法详解
Oct 22 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
Dec 19 Python
django序列化时使用外键的真实值操作
Jul 15 Python
浅谈Python描述数据结构之KMP篇
Sep 06 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
Oct 30 Python
python里glob模块知识点总结
Jan 05 Python
python中封包建立过程实例
Feb 18 #Python
python解包用法详解
Feb 17 #Python
python压包的概念及实例详解
Feb 17 #Python
python解包概念及实例
Feb 17 #Python
requests在python中发送请求的实例讲解
Feb 17 #Python
python切片作为占位符使用实例讲解
Feb 17 #Python
Django视图类型总结
Feb 17 #Python
You might like
Yii2框架中日志的使用方法分析
2017/05/22 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
2015/02/05 Javascript
javascript图片预加载实例分析
2015/07/16 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
js模拟微博发布消息
2017/02/23 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
JS对象和字符串之间互换操作实例分析
2019/02/02 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
[46:03]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
使用Python神器对付12306变态验证码
2016/01/05 Python
python使用psutil模块获取系统状态
2016/08/27 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
python实现按长宽比缩放图片
2018/06/07 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
python实现人机猜拳小游戏
2020/02/03 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
Python求凸包及多边形面积教程
2020/04/12 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
2020/11/25 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
手术室护士自我鉴定
2013/10/14 职场文书
新闻记者个人求职的自我评价
2013/11/28 职场文书
采购部部长岗位职责
2014/02/06 职场文书
初中教师业务学习材料
2014/05/12 职场文书
家长建议怎么写
2014/05/15 职场文书
尊师重教演讲稿
2014/09/04 职场文书
董事长助理岗位职责
2015/02/11 职场文书
主持稿开场白
2015/06/01 职场文书
《月光曲》教学反思
2016/02/16 职场文书
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技