千家信息网

Django中怎么执行原生SQL

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这期内容当中小编将会给大家带来有关Django中怎么执行原生SQL,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。表结构文件:django_project/app01
千家信息网最后更新 2025年11月07日Django中怎么执行原生SQL

这期内容当中小编将会给大家带来有关Django中怎么执行原生SQL,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

表结构

文件: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录入一些数据测试使用

extra方式

强烈建议,不用学,没毛用

raw方式

这个相比较extra,还是比较有用的,

语法如下

models.表名.objecs.raw(sql) models.表名.objecs.raw(sql,[参数1,参数2])

注:如果没有参数,就只写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)

返回内容如下图所示:

可以看到,返回的是列表里面套一个个的数组。我就在想,有没有什么办法能将查询出来的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

用法如下,直接在视图中调用函数

返回结果如下,直接是列表套字典格式

那查询带条件的怎么办哪,其实和pymysql一个样

返回结果

但是有个问题,上面的查询,我们明明知道,让只会返回一个值,但是还是返回的是列表套字典格式,似乎不太对呐?

其实上述我写的是两个办法,如果确定就查询一个值,使用query_one_dict方法。

上述总结

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

上述就是小编为大家分享的Django中怎么执行原生SQL了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

查询 字典 方式 代码 参数 就是 结果 两个 内容 数据 格式 还是 函数 办法 多个 建议 方法 类型 问题 分析 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 计算机网络技术和机电技术应用 华安媒体互联网科技 软件开发app高端定制 幻塔不同服务器的人可以加好友吗 铜梁区电话网络技术服务内容 重庆外汇自动交易软件开发 数据库建设图表有什么好处 广联达软件数据库异常 网络安全和隐私保护挑战 硬盘放数据库 艺电能源互联网科技有限公司招聘 服务器实时检测是否有图片上传 mac 登陆远程服务器 最终幻想服务器玩家数 服务器安全防护的行情 直播电商软件开发中心 绝世仙王轮回服务器苹果系统出错 数据库并列查询语句 数据库1048错误 数据库文件干什么用的 巨杉数据库生产环境硬件 深圳市驰鸿网络技术有限公司 网络技术有限公司日常经营 服务器文件泄露原理 龙之谷手游服务器价格 数据库怎么定义游标 上班后软件开发进修 java 数据库字符集问题 中国电信apn服务器怎么设置 代码直接写入odoo数据库
0