Django中怎么执行原生SQL

63次阅读
没有评论

共计 2328 个字符,预计需要花费 6 分钟才能阅读完成。

这期内容当中丸趣 TV 小编将会给大家带来有关 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

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计2328字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)