Django使用原生SQL查询数据库详解

关于使用Django进行原生SQL查询,我们需要先了解一下Django提供给我们的两种方式:

  1. 使用自定义的SQL作为Django查询的一部分,基本与SQLalchemy等ORM框架使用方式相同。此方式执行的是基于Django所定义的模型中的数据查询,且在Django的查询集上已经默认处理了ORM的一些坑点使其可读性更清晰;

  2. 使用Django提供的 django.db.connectionsconnection.cursor() 方法,直接在数据库中执行原生SQL语句,执行的是纯净原生SQL查询,但相较于前面的方式更为麻烦。

接下来,我们以两个示例详细介绍这两种方式的使用方法。

使用自定义SQL查询

这种方式需要借助Django提供的 Model.objects.raw() 方法,并传入自定义SQL语句,因会执行Query拼接操作,所以仅在需要自定义的数据查询时使用。

下面是示例:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

def get_person():
    return Person.objects.raw('SELECT * FROM myapp_person')

在这里,我们自定义了SQL SELECT * FROM myapp_person 查询Person这个模型中的数据。

直接执行SQL

使用Django提供的 connection.cursor() 搭配 connection.execute() 方法即可执行原生SQL。

from django.db import connection

with connection.cursor() as cursor:
    cursor.execute("SELECT * FROM myapp_person")
    row = cursor.fetchone()

在这里,我们使用 cursor.execute() 方法来执行我们的原生SQL语句,接下来就可以通过获得的 row 来访问数据。

当然,除了 fetchone() 方法还支持其他的方法,如 fetchall()fetchmany() 等,具体使用请查看Django官方文档。

以上就是Django使用原生SQL查询数据库的完整攻略及两个示例说明,希望能帮到你。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django使用原生SQL查询数据库详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • django添加跨域头

    一、什么是跨域 浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域 二、浏览器的同源策略 同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制 三、同源的定义 如果两个页面的协议,端口(如果有指定)和主机都相同,则两个页面具有相同的源。我们也可以把它称为“协议/主…

    Django 2023年4月11日
    00
  • Django Rest Framework 序列化接口(PUT与Delete)设计 (前期版)!

    所有都是用 《Django Rest Framework 序列化接口(PUT与Delete)设计 (前期版)! 》中的代码,在view.py中新增 如下: #更新数据接口设计 def put(self,request,nid): #过滤出nid等于多少的对象。 book_obj = models.Book.objects.filter(pk=nid) ”’…

    Django 2023年4月12日
    00
  • Django中密码的加密、验密、解密操作

    Django提供了非常安全和简便的密码加密、验证和解密API,可以帮助在web应用中加强用户密码保护。下面我们详细讲解Django中密码加密、验密、解密的完整攻略和示例。 密码加密(Hashing) 在Django中,可以使用密码哈希工具来进行密码加密,并存储在数据库中。这个哈希算法确保密码的安全性,因为如果存储的密码被泄露,那么泄露的也是哈希值,而不是原始…

    Django 2023年5月15日
    00
  • django FileFIeld和ImageField 上传路径改写

    def get_file_path(instance, filename): return ‘file/document/%s/%s/%s’ % (instance.period.code, instance.student.college.code, filename) class Document(models.Model): title = model…

    Django 2023年4月9日
    00
  • Django:(08)序列化器

    1、序列化和反序列化变量从内存中变成可存储或传输的过程称之为序列化,序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化。 序列化是将对象状态转换为可保持或可传输的形式的过程。序列化的补集是反序列化,后者将流转换为对象。这两个过程一起保证数据易于存储和传输。 2、Django中…

    Django 2023年4月11日
    00
  • Django框架之drf:5、反序列化器校验部分源码分析、断言、drf之请求与响应、视图组件介绍及两个视图基类、代码部分实战

    Django框架之drf 目录 Django框架之drf 一、反序列化类校验部分源码解析 二、断言 三、drf之请求 1、Request能够解析的前端传入编码格式 2、Request类中的属性和方法 四、drf之响应 1、Response能够响应的编码格式 2、Response的源码属性或方法 五、视图组件介绍及两个视图基类 1、APIView与View区别…

    2023年4月10日
    00
  • Django常见出错解决方案汇总-乾颐堂

    一、模板类型错误: 错误原因:在models中漏掉了return: class UserProfile(models.Model):      “””      功能说明:        扩展用户      ————————————————————————— …

    Django 2023年4月13日
    00
  • Django的学习——全局的static和templates的使用

    一、问题 首先我们在进行Django框架搭建的时候我们需要建立一个全局的变量,一是为了实现代码的复用,二是为了方便管理,如下图的样式   二、解决 1、修改setting里面的配置文件①templates的路径:按照以下的规则进行添加【app/templates】,然后在APP下面建立这个templates。 APP下的:   ②static的路径:在最后添…

    Django 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部