如何在 Django 中执行原生 SQL

分类:编程技术 时间:2024-02-20 15:29 浏览:0 评论:0
0
本期小编将为大家带来如何在Django中执行原生SQL的相关知识。文章内容丰富,从专业角度进行了分析和描述。希望您能通过阅读本文有所收获。

表结构

文件:django_project/app01/models

class Book(models.Model): title = models.CharField (verbose_name="书名", max_length=32) 描述 = models.TextField(verbose_name="描述") 作者 = models.CharField(verbose_name="作者", max_length=32) 出版商 = models.CharField(verbose_name="发布Society", max_length=32)publisher_date = models.DateField(verbose_name="publisher")

这是一个非常简单的图书表

通过admin输入一些数据进行测试

额外方法

强烈推荐,无需学习,无用

原始方法

原始方法

p>strong>

这个比extra有用。

语法如下

models.table name.objecs.raw(sql) models.table name .objecs.raw(sql,[参数1,参数2])

注意:如果没有参数,就写sql语句中的个数,需要后面要用列表,如图

示例

返回的Book对象还是一一的

< strong>真正的原生SQL方法

上面的内容实际上与Django模型有些绑定。但我想说的是,我只想要原生sql,没有任何绑定。

这里告诉大家,千万不要在django中使用pymysql来执行原生sql,这样会出现一些奇怪的问题。一定要从django.db导入连接来执行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)

返回内容如下:

如你所见,ret是什么urned 是列表内的数组的数组。我就在想,有没有办法直接将查询出来的SQL返回成字典呢?答案当然是!

执行原生SQL并返回为字典

我将执行原生SQL并直接返回为字典的方法封装成两个函数

一种是查询多个,代码如下:

def query_all_dict(sql, params=None) :  ''' 查询所有结果,返回字典类型数据 :param sql : :param params: :return: ''' 以 connection.cursor() 作为游标: if params:cursor.execute(sql, params =params) else:cursor.execute(sql) col_names = [desc[0] for desc incursor.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() 作为游标: 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、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。如果你正好有类似的疑惑,不妨参考上面的分析来了解一下。如果您想了解更多相关知识,请关注行业资讯频道。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何在 Django 中执行原生 SQL

用户评论