手把手教你用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时间戳与时间字符串互相转换实例代码
Nov 28 Python
python文件操作整理汇总
Oct 21 Python
Python使用sorted排序的方法小结
Jul 28 Python
查找python项目依赖并生成requirements.txt的方法
Jul 10 Python
python按键按住不放持续响应的实例代码
Jul 17 Python
python re.sub()替换正则的匹配内容方法
Jul 22 Python
pytorch 自定义参数不更新方式
Jan 06 Python
Python 统计位数为偶数的数字代码详解
Mar 15 Python
如何理解python中数字列表
May 29 Python
python中加背景音乐如何操作
Jul 19 Python
Python基于Serializer实现字段验证及序列化
Nov 04 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
Mar 04 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
文章推荐系统(三)
2006/10/09 PHP
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
php PDO异常处理详解
2016/11/20 PHP
让FireFox支持innerText的实现代码
2009/12/01 Javascript
jQuery+jqmodal弹出窗口实现代码分明
2010/06/14 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
微信小程序实现表单校验功能
2020/03/30 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
详解Ubuntu安装angular-cli遇到的坑
2018/09/08 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
python递归实现快速排序
2018/08/18 Python
对Python实现简单的API接口实例讲解
2018/12/10 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
Python读取Excel数据并生成图表过程解析
2020/06/18 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
HTML5 3D书本翻页动画的实现示例
2019/08/28 HTML / CSS
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
Servlet如何得到客户端机器的信息
2014/10/17 面试题
运动会开幕式邀请函
2014/01/22 职场文书
小学一年级学生评语
2014/04/22 职场文书
家庭教育的心得体会
2014/09/01 职场文书
人大代表选举标语
2014/10/07 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
因身体原因离职的辞职信范文
2015/05/12 职场文书
辛亥革命观后感
2015/06/02 职场文书