如何在 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)
返回内容如下:
p>
如你所见,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,]格式 p>
改进后,封装了两个方法,query_all_dict和query_one_dict,一个是查询多个,一个是查询单个。并返回为[dict,dict,dict, ]
建议
仅使用query_all_dict、query_one_dict
项目代码
django_exec_sql.zip
以上就是小编给大家分享的如何在Django中执行原生SQL。如果你正好有类似的疑惑,不妨参考上面的分析来了解一下。如果您想了解更多相关知识,请关注行业资讯频道。
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何在 Django 中执行原生 SQL