手把手教你用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计数排序和基数排序算法实例
Apr 25 Python
pycharm 使用心得(八)如何调用另一文件中的函数
Jun 06 Python
Python通过递归遍历出集合中所有元素的方法
Feb 25 Python
Python for循环中的陷阱详解
Jul 13 Python
django组合搜索实现过程详解(附代码)
Aug 06 Python
安装2019Pycharm最新版本的教程详解
Oct 22 Python
解决python 读取 log日志的编码问题
Dec 24 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
Jan 20 Python
pytorch中的inference使用实例
Feb 20 Python
简单了解django处理跨域请求最佳解决方案
Mar 25 Python
详解Python中pyautogui库的最全使用方法
Apr 01 Python
Python中Cookies导出某站用户数据的方法
May 17 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
在WordPress的文章编辑器中设置默认内容的方法
2015/12/29 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
jquery常用技巧及常用方法列表集合
2011/04/06 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
jqplot通过ajax动态画折线图的方法及思路
2013/12/08 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
在js文件中引入(调用)另一个js文件的三种方法
2020/09/11 Javascript
jquery实现穿梭框功能
2021/01/19 jQuery
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
Python操作列表的常用方法分享
2014/02/13 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
2018/05/21 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
Python使用pickle进行序列化和反序列化的示例代码
2020/09/22 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
html5使用canvas画三角形
2014/12/15 HTML / CSS
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
建筑施工实习自我鉴定
2013/09/19 职场文书
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
社团活动总结怎么写
2014/06/30 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
2015年教研工作总结
2015/05/23 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书