手把手教你用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实例之wxpython中Frame使用方法
Jun 09 Python
python自动化测试之setUp与tearDown实例
Sep 28 Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 Python
python 请求服务器的实现代码(http请求和https请求)
May 25 Python
基于python的selenium两种文件上传操作实现详解
Sep 19 Python
pyhton中__pycache__文件夹的产生与作用详解
Nov 24 Python
python 解决print数组/矩阵无法完整输出的问题
Feb 19 Python
python数据预处理 :数据共线性处理详解
Feb 24 Python
Python图片处理模块PIL操作方法(pillow)
Apr 07 Python
Spark处理数据排序问题如何避免OOM
May 21 Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 Python
Python基于Webhook实现github自动化部署
Nov 28 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
php cache类代码(php数据缓存类)
2010/04/15 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
2013/05/10 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
2017/03/14 PHP
YII框架http缓存操作示例
2019/04/29 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
CLASS_CONFUSION JS混淆 全源码
2007/12/12 Javascript
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
js对象之JS入门之Array对象操作小结
2011/01/09 Javascript
通过js获取div的background-image属性
2013/10/15 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
2015/01/02 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
javascript实现九宫格相加数值相等
2020/05/28 Javascript
JS原型链怎么理解
2016/06/27 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
微信小程序实现城市列表选择
2018/06/05 Javascript
js实现图片上传并预览功能
2018/08/06 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
Vue项目中ESlint规范示例代码
2019/07/04 Javascript
vue2路由方式--嵌套路由实现方法分析
2020/03/06 Javascript
Python Matplotlib库入门指南
2015/05/18 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
Random 在 Python 中的使用方法
2018/08/09 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
Python基于Hypothesis测试库生成测试数据
2020/04/29 Python
Python sqlalchemy时间戳及密码管理实现代码详解
2020/08/01 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
html5 乒乓球(碰撞检测)实例二
2013/07/25 HTML / CSS
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
毕业季聚会祝酒词!
2019/07/04 职场文书
html,css,javascript是怎样变成页面的
2023/05/07 HTML / CSS