手把手教你用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搭建Django应用程序步骤及版本冲突问题解决
Nov 19 Python
python基于mysql实现的简单队列以及跨进程锁实例详解
Jul 07 Python
python实现根据图标提取分类应用程序实例
Sep 28 Python
PYTHON 中使用 GLOBAL引发的一系列问题
Oct 12 Python
Python内置函数delattr的具体用法
Nov 23 Python
Python基于sklearn库的分类算法简单应用示例
Jul 09 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
Python 带有参数的装饰器实例代码详解
Dec 06 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
Jan 03 Python
python openCV获取人脸部分并存储功能
Aug 28 Python
pytorch实现mnist分类的示例讲解
Jan 10 Python
python中wx模块的具体使用方法
May 15 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自动加载的两种实现方法
2010/06/21 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
深入解析PHP的引用计数机制
2013/06/14 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
jQuery中:only-child选择器用法实例
2015/01/03 Javascript
jQuery解决$符号命名冲突
2016/06/18 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
Angular模板表单校验方法详解
2017/08/11 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
基于Vue单文件组件详解
2017/09/15 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
2018/09/07 Javascript
JS中实现一个下载进度条及播放进度条的代码
2019/06/10 Javascript
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
python从sqlite读取并显示数据的方法
2015/05/08 Python
python MysqlDb模块安装及其使用详解
2018/02/23 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
2020/03/18 Python
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
非功能性需求都包括哪些方面
2013/10/29 面试题
物业管理求职自荐信
2013/09/25 职场文书
幼师自荐信
2013/10/26 职场文书
简历中个人自我评价范文
2013/12/26 职场文书
六一儿童节开幕词
2015/01/29 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
Android存储中最基本的文件存储方式
2022/04/30 Java/Android