手把手教你用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 解析XML python模块xml.dom解析xml实例代码
Feb 07 Python
Python中的pprint折腾记
Jan 21 Python
python实现批量改文件名称的方法
May 25 Python
Django框架中方法的访问和查找
Jul 15 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
基于Django统计博客文章阅读量
Oct 29 Python
Python 自由定制表格的实现示例
Mar 20 Python
python UIAutomator2使用超详细教程
Feb 19 Python
python 第三方库paramiko的常用方式
Feb 20 Python
Django中的JWT身份验证的实现
May 07 Python
python中的class_static的@classmethod的巧妙用法
Jun 22 Python
python数字类型和占位符详情
Mar 13 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
多重?l件?合查?(二)
2006/10/09 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
php出现web系统多域名登录失败的解决方法
2014/09/30 PHP
PHP如何将log信息写入服务器中的log文件
2015/07/29 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
javascript知识点收藏
2007/02/22 Javascript
再论Javascript的类继承
2011/03/05 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
Javascript写入txt和读取txt文件示例
2014/02/12 Javascript
在父页面得到zTree已选中的节点的方法
2015/02/12 Javascript
微信小程序 navigation API实例详解
2016/10/02 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
js实现数组和对象的深浅拷贝
2017/09/30 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
微信小程序实现通讯录列表展开收起
2020/11/18 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
python实现对一个完整url进行分割的方法
2015/04/29 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
Pyinstaller打包.py生成.exe的方法和报错总结
2019/04/02 Python
python3.5 cv2 获取视频特定帧生成jpg图片
2019/08/28 Python
详解python uiautomator2 watcher的使用方法
2019/09/09 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
圣诞节红领巾广播稿
2014/02/03 职场文书
单位活动策划方案
2014/08/17 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
实施意见格式范本
2015/06/05 职场文书
基石观后感
2015/06/12 职场文书
java如何实现socket连接方法封装
2021/09/25 Java/Android
详细聊聊vue中组件的props属性
2021/11/02 Vue.js
Java 实战项目之家居购物商城系统详解流程
2021/11/11 Java/Android