Django执行原生SQL

Django执行原生SQL

前言

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

class Book(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

代码

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)

返回内容

在这里插入图片描述

可以看到,返回的是列表里面套一个个的数组

我就在想,有没有什么办法能将查询出来的sql,直接返回成字典

当然可以,

执行原生sql并且返回成dict

我将执行原生sql并且直接返回成字典的方式封装成了两个函数

一个是查询多个

def query_all_dict(sql, params=None):
    '''
    查询所有结果返回字典类型数据
    :param sql:
    :param params:
    :return:
    '''
    with connection.cursor() as cursor:
        if params:
            cursor.execute(sql, params=params)
        else:
            cursor.execute(sql)
        col_names = [desc[0] for desc in cursor.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() as 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有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

如果在操作过程中有任务问题,记得下面留言,我们看到会第一时间解决问题

我是码农星期八,如果觉得还不错,记得动手点赞以下哈,

感谢你的观看

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值