前言各位小伙伴,这次怎么玩,怎么用Django执行原生SQL。我们都知道,web界的Python老大Django可以说是集大成于一身,各种插件、表单组件、模型模型、Admin后台等等,后面我会专门写一篇文章,反正就一个字,NB。这一次,让我们学习如何在Django中执行原生语句。原因是在使用Django的时候,一般情况下,我们使用Django自带的模型查询是没有问题的,基本可以解决80%的问题。但是,但是,那20%不需要吗???当然不是,一个孩子在Django中可以通过三种方式来选择执行原生SQL:extrarawdjangoconnection一般情况下,以上三种方式都是表结构文件:django_project/app01/modelsclassBook(models.Model):title=models.CharField(verbose_name="书名",max_length=32)describe=models.TextField(verbose_name="Description")author=models.CharField(verbose_name="作者",max_length=32)publisher=models.CharField(verbose_name="Publisher",max_length=32)publisher_date=models.DateField(verbose_name="publisher")是一个非常简单的书表。通过admin输入一些数据进行测试。强烈建议使用extra方法。没有必要学习和使用原始方法。和extra方法相比,还是比较有用的,语法如下models.tablename.objecs.raw(sql)models.tablename.objecs.raw(sql,[parameter1,parameter2])注意:如果没有参数,直接写sql语句即可,如果有参数,下面就需要用到list,如图,返回的Book对象还是一个一个的。上面说的真正的原生SQL方法其实是和django模型有些绑定的。但我的意思是,我只想要原生sql,不绑定任何东西。在这里告诉大家,在django中不要使用pymysql执行原生sql,会出现一些奇怪的问题。一定要importfromdjango.dbimportconnection来执行sql。代码如下:fromdjango.dbimportconnectiondefbook_list(request):#realnativesql,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):'''查询所有结果并返回字典类型data: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::返回:"""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))returnMap用法如下。直接在视图中调用函数返回结果如下。直接是列表字典的形式。查询有条件怎么办?其实它返回的结果和pymysql是一样的,但是有一个问题,上面的查询,我们明明知道它只会返回一个值,但是它仍然返回一个字典列表,这好像不对?其实我上面写了两个方法。如果确定,可以查询一个值并使用query_one_dict方法。以上总结了Django中执行原生SQL的三种方式,extra、raw、fromdjango.dbimportconnection。其中extra基本没用,raw还可以,但是绑定了models。connection是最灵活的,但是默认返回的是[tuple,Thetuple,tuple,]格式,改进了,封装了两个方法,query_all_dict,query_one_dict,一个是查询多个,一个是查询单个,还有返回[dict,dict,dict,]建议只使用query_all_dict,query_one_dict项目代码django_exec_sql.zip需要本文完整代码的朋友可以在本篇后台回复关键字:nativeSQL公众号to得到它。综上所述,上述入门方法解决了如何通过django执行nativeSQL的问题。微笑着告诉别人,今天的我比昨天好,以后也一样。本文转载自微信公众号《Python爬虫与数据挖掘》,可通过以下二维码关注。转载本文请联系Python爬虫与数据挖掘公众号。
