• 售前

  • 售后

热门帖子
入门百科

手把手教你用Django实行原生SQL的方法

[复制链接]
街充骨万怎 显示全部楼层 发表于 2021-10-25 19:41:32 |阅读模式 打印 上一主题 下一主题
前言

Hey,各位小同伴,这次怎么来玩一下,怎样使用Django实验原生SQL。
我们都知道,Python在web界的扛把子——Django,可谓是集大成为统一,各种各样的插件、forms组件、model模子、Admin后台等等,反面我会专门出文章娓娓道来,反正就是一个字,NB。
本次就来学一下,怎样在Django实验原生语句。
因由

在使用Django时,一样寻常情况下,我们使用Django自带的model查询是没有问题的,基本能满足80%的问题
但是,但是,那20%就不要了吗???肯定不行哎,小孩才做选择
在Django实验原生SQL有以下三种方式
      
  • extra  
  • raw  
  • django connection
一样寻常情况下,就以上三种方式
表结构

文件:django_project/app01/models
  1. class Book(models.Model):
  2.   title = models.CharField(verbose_name="书名", max_length=32)
  3.   describe = models.TextField(verbose_name="描述")
  4.   author = models.CharField(verbose_name="作者", max_length=32)
  5.   publisher = models.CharField(verbose_name="出版社", max_length=32)
  6.   publisher_date = models.DateField(verbose_name="publisher")
复制代码
就是一个很简朴的图书表
通过admin录入一些数据测试使用

extra方式

猛烈发起,不用学,没毛用
raw方式

这个相比力extra,照旧比力有效的,
语法如下
  1. models.表名.objecs.raw(sql)
  2. models.表名.objecs.raw(sql,[参数1,参数2])
复制代码
注:如果没有参数,就只写sql语句,如果由参数,反面必要用列表,如图所示
举例

返回的仍旧一个个的Book对象
真正的原生sql方式

上述的,其实照旧和django的model有些绑定。但是我就是说,我就是想要原生sql,不要跟任何绑定。
这里说一下,万万不要在django使用pymysql实验原生sql,会发生一些奇怪的问题。肯定要导入from django.db import connection实验sql。代码如下:
  1. from django.db import connection
  2. def book_list(request):
  3.   # 真正的原生sql,
  4.   cursor = connection.cursor()
  5.   print(type(cursor))
  6.   cursor.execute("select * from app01_book where id=%s", [1, ])
  7.   raw = cursor.fetchall()
  8.   print(raw)
复制代码
返回内容如下图所示:

可以看到,返回的是列表内里套一个个的数组。我就在想,有没有什么办法能将查询出来的sql,直接返回成字典呢?答案是当然可以!
实验原生sql而且返回成dict
我将实验原生sql而且直接返回成字典的方式封装成了两个函数
一个是查询多个,代码如下所示:
  1. def query_all_dict(sql, params=None):
  2.   '''
  3.   查询所有结果返回字典类型数据
  4.   :param sql:
  5.   :param params:
  6.   :return:
  7.   '''
  8.   with connection.cursor() as cursor:
  9.     if params:
  10.       cursor.execute(sql, params=params)
  11.     else:
  12.       cursor.execute(sql)
  13.     col_names = [desc[0] for desc in cursor.description]
  14.     row = cursor.fetchall()
  15.     rowList = []
  16.     for list in row:
  17.       tMap = dict(zip(col_names, list))
  18.       rowList.append(tMap)
  19.     return rowList
复制代码
一个是查询一个,代码如下所示:
  1. def query_one_dict(sql, params=None):
  2.   """
  3.   查询一个结果返回字典类型数据
  4.   :param sql:
  5.   :param params:
  6.   :return:
  7.   """
  8.   with connection.cursor() as cursor:
  9.     if params:
  10.       cursor.execute(sql, params=params)
  11.     else:
  12.       cursor.execute(sql)
  13.     col_names = [desc[0] for desc in cursor.description]
  14.     row = cursor.fetchone()
  15.     tMap = dict(zip(col_names, row))
  16.     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
项目代码
  1. django_exec_sql.zip
复制代码
必要本文完备代码的小同伴,可以在本公众号后台复兴关键字:原生SQL,进行获取。
总结

上述以入门的方式解决了安排了以下怎样通过django实验原生sql。
用微笑告诉别人,今天的我比昨天强,今后也一样。
到此这篇关于手把手教你用Django实验原生SQL的方法的文章就先容到这了,更多相干Django实验原生SQL内容请搜索草根技术分享从前的文章或继续欣赏下面的相干文章盼望大家以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作