Django中怎么执行原生SQL
这期内容当中小编将会给大家带来有关Django中怎么执行原生SQL,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
表结构
文件:django_project/app01/models
classBook(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。代码如下:
fromdjango.dbimportconnectiondefbook_list(request):#真正的原生sql,cursor=connection.cursor()print(type(cursor))cursor.execute("select*fromapp01_bookwhereid=%s",[1,])raw=cursor.fetchall()print(raw)
返回内容如下图所示:
可以看到,返回的是列表里面套一个个的数组。我就在想,有没有什么办法能将查询出来的sql,直接返回成字典呢?答案是当然可以!
执行原生sql并且返回成dict
我将执行原生sql并且直接返回成字典的方式封装成了两个函数
一个是查询多个,代码如下所示:
defquery_all_dict(sql,params=None):'''查询所有结果返回字典类型数据:paramsql::paramparams::return:'''withconnection.cursor()ascursor:ifparams:cursor.execute(sql,params=params)else:cursor.execute(sql)col_names=[desc[0]fordescincursor.description]row=cursor.fetchall()rowList=[]forlistinrow:tMap=dict(zip(col_names,list))rowList.append(tMap)returnrowList
一个是查询一个,代码如下所示:
defquery_one_dict(sql,params=None):"""查询一个结果返回字典类型数据:paramsql::paramparams::return:"""withconnection.cursor()ascursor:ifparams:cursor.execute(sql,params=params)else:cursor.execute(sql)col_names=[desc[0]fordescincursor.description]row=cursor.fetchone()tMap=dict(zip(col_names,row))returntMap
用法如下,直接在视图中调用函数
返回结果如下,直接是列表套字典格式
那查询带条件的怎么办哪,其实和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了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。