Django 中的 connection.cursor() 执行 SQL 用法

        在 Django 开发中,通常依赖于 Django ORM 来处理数据库操作,它提供了一个高级的抽象层,使得数据库交互更加直观和安全。然而,有时可能需执行一些复杂的查询或数据库操作,这些操作可能超出了 ORM 的能力范围(比如动态生成DB表结构等等)。在这些情况下,可以使用 Django 的底层数据库 API 来执行原生 SQL 语句。本文将介绍如何在 Django 中使用 connection.cursor() 来执行 SQL 语句。


Django 的数据库连接

获取游标

要执行SQL查询,首先需要获取数据库的游标:

from django.db import connectioncursor = connection.cursor()

执行查询

有了游标,才可执行SQL查询:

cursor.execute("SELECT * FROM my_table")

处理结果

执行查询后,你可以使用 fetchone()fetchmany() 或 fetchall() 方法来检索结果:

rows = cursor.fetchall()  # 读取所有数据,下面有介绍其他方法
for row in rows:print(row)print(row[0])

关闭游标

完成数据库操作后,应关闭游标以释放资源:

cursor.close()

使用上下文管理器(推荐)

为简化资源管理,推荐使用 with 语句作为上下文管理器,会在代码块执行完毕后自动关闭游标:

with connection.cursor() as cursor:cursor.execute("SELECT * FROM my_table")

 

        更多connection.cursor() 执行 SQL 用法

执行 SQL 查询

有了游标对象,可用它来执行 SQL 查询。以下是一个执行 SELECT 查询的例子:

cursor.execute("SELECT * FROM myapp_mymodel")

你也可以使用参数化查询来防止 SQL 注入攻击:

cursor.execute("SELECT * FROM myapp_mymodel WHERE id = %s", [some_id])

获取查询结果

执行查询后,你可以使用游标的 fetchone()fetchmany() 或 fetchall() 方法来检索结果。

# 获取单个结果
row = cursor.fetchone()# 获取多个结果(可以指定数量)
rows = cursor.fetchmany(size=5)# 获取所有结果
rows = cursor.fetchall()

一些读取操作:

# 读取
for tup in cursor.fetchall():data.append({"id": tup[0], "name": tup[1], "teach_id": tup[2], "teacher_name": tup[3], "content": tup[4]})# 判断
one = cursor.fetchone()
if one is not None:return Response({'message': f'{one[0]}已存在'}, status=status.HTTP_400_BAD_REQUEST)

但有发现,返回的都是一个列表,而无法直接用数据库表字段名锁定,这是有个其他方法,能锁定到字段名对应的索引列。

columns = {col[0]: idx for idx, col in enumerate(cursor.description)}print(columns)
# {'create_time': 0, 'update_time': 1, 'uid': 2, 'task_uid': 3, 'usage': 4, 'type': 5}
# k-v 为 字段名-索引# 获取所有行
rows = cursor.fetchall()
for row in rows:# 使用列名来访问数据name = row[columns['name']]print(name)

执行事务

在执行更新、删除或插入操作时,你可能需要使用事务来确保数据的一致性。Django 默认在每个请求的末尾自动提交事务,但你可以手动控制事务的提交和回滚(在执行 INSERT、UPDATE 或 DELETE 操作时,大可能控制事务的提交和回滚):

try:with connection.cursor() as cursor:# 执行SQL查询cursor.execute("UPDATE my_table SET field = %s WHERE another_field = %s", ['new_value', 'some_value'])# 提交更改connection.commit()  except Exception as err:# 发生异常,回滚事务connection.rollback()print("An error occurred: ", err)

注:

  • 用 SQL 查询可能会绕过 Django 的安全和验证机制,因此需要谨慎处理输入。
  • 原生 SQL 查询时,确保查询与你的数据库后端兼容。
  • 用 connection.cursor() 时,记得遵循数据库的最佳实践,比如使用参数化查询来防止 SQL 注入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/661098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ansible自动化运维实战

一、abstract简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric) 的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能.无客户端。我们要学一些Ansible的安装和一些基…

【劳德巴赫 Trace32 高阶系列 4 -- Trace32 JTAG 常用命令】

文章目录 Trace32 JTAG 常用命令JTAG.PINJTAG 信号值读取JTAG.SHIFTREGExampleJTAG.SHIFTTDIExampleJTAG.SHIFTTMSExampleJTAG.PROGRAM.SVFTrace32 JTAG 常用命令 JTAG (Joint Test Action Group) 是一种常用的调试和测试标准,用于在电子系统的芯片和板级测试中。在JTAG标准中…

2024最新版MongoDB安装使用指南

2024最新版MongoDB安装使用指南 Installation and Usage Guide of the Latest MongoDB Community Edition in 2024 By JacksonML MongoDB is a document database with the scalability and flexibility that you want with the querying and indexing that you need. – mon…

gitlib部署及应用

一. 下载源网址 Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source MirrorIndex of /gitlab-ce/yum/el7/ | 清华大学开源软件…

【DeepLearning-7】 CNN 和Transformer的混合神经网络结构

构造函数__init__ def __init__(self, channel, dim, depth2, kernel_size3, patch_size(2, 2), mlp_dimint(64*2), dropout0.):初始化函数定义了网络的主要结构和参数。channel: 输入特征的通道数。dim: Transformer部分的特征维度。depth: Transformer的层数。kernel_size: 卷…

ios和安卓虚拟定位

ios 下载好爱思助手 连接手机 电脑上打开爱思助手,打开工具箱,选择虚拟定位。 选择位置即可 重启可以恢复定位 安卓 fake gps。这个需要我们打开 google play 去下载。

2024-01-06-AI 大模型全栈工程师 - 大模型时代的 AI 产品新挑战

摘要 2024-01-06 周六 杭州 晴 课程内容 1. 上一代 AI 能做什么? 2. AI 的能力演进 3. LLMS 带来了哪些变化 4. LLMS 存在哪些问题 5. LLMS 落地的三个关键要素 6. LLMS 短期落地的方向-内容生成 7. LLMS 中期落地的方向-智能体 8. 从 LLMS 到可落地的应用 9. LL…

八种Flink任务监控告警方式

目录 一、Flink应用分析 1.1 Flink任务生命周期 1.2 Flink应用告警视角分析 二、监控告警方案说明 2.1 监控消息队中间件消费者偏移量 2.2 通过调度系统监控Flink任务运行状态 2.3 引入开源服的SDK工具实现 2.4 调用FlinkRestApi实现任务监控告警 2.5 定时去查询目标库…

【数据结构(C语言)】树、二叉树详解

目录 文章目录 前言 一、树的概念及结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用 二、二叉树的概念及结构 2.1 二叉树的概念 2.2 二叉树的基本形态 ​编辑2.3 特殊的二叉树 2.4 二叉树的性质 2.5 二叉树的存储结构 三、二叉树的顺序结…

堆溢出:深入理解与防范

在计算机安全领域中,堆溢出是一种常见的安全漏洞,它涉及到程序中的内存分配和管理。本文将深入探讨堆溢出的概念、原因以及防范措施。 首先,我们需要了解什么是堆。在许多编程语言中,如C和C,堆是用于动态内存分配的区…

adb push 将电脑中的文件传输到安卓开发板

1. adb remount 重新挂载设备的文件系统,以便可以对设备进行读写操作,通常情况下,安卓开发板在连接到计算机后,设备的文件系统会被挂载为只读文件系统,重新挂载后变成可读可写权限 C:\Users\Administrator>adb re…

Dart 语言入门

引言 在学习Flutter之前&#xff0c;还是得先把基础打好&#xff0c;先来学习一下Dart的基础知识。 第一个dart import package:dart/dart.dart as dart;main(List<String> arguments) {print(Hello world: ${dart.calculate()}!); } 变量与常量 1.变量 Dart是一个强…

高等数学:积分

本文主要参考&#xff1a; 【建议收藏】同济七版《高等数学》精讲视频 | 期末考试 | 考研零基础 | 高数小白_哔哩哔哩_bilibili 4.1.1.1 定积分引例_哔哩哔哩_bilibili 仅供本人学习使用。 积分是一个在多个领域都广泛使用的概念&#xff0c;特别是在数学和物理学中。 以下是积…

深入了解c语言字符串 2

深入了解c语言字符串 2 一 使用 scanf进行字符串的输入&#xff1a;1.1输入单词&#xff08;不包含空格&#xff09;&#xff1a;1.2 输入带空格的整行文本&#xff1a;1.3 处理输入缓冲区&#xff1a;1.4 注意安全性&#xff1a; 二 使用 printf 字符串的输出&#xff1a;三 输…

春招秋招,在线测评到底难不难?

现在很多企业在春招的时候&#xff0c;都会有一个在线测评的环节&#xff0c;目的当然就是希望更加了解清楚毕业生的综合能力以及其他方面的素质&#xff0c;好让HR可以根据岗位筛选出能力达标的人才。所以&#xff0c;现在不少即将面对春招的大学毕业生&#xff0c;比较关心的…

sklearn缺失值处理:SimpleImputer模块 补全缺失值

文章目录 SimpleImputer参数详解参数含义常用方法sklearn.impute工具介绍SimpleImputer参数详解 class sklearn.impute.SimpleImputer(*, missing_values=nan, strategy=‘mean’, fi

uniapp中组件库Mask 遮罩层 的使用方法

目录 #平台差异说明 #基本使用 #嵌入内容 #遮罩样式 #API #Props #Events #Slot 创建一个遮罩层&#xff0c;用于强调特定的页面元素&#xff0c;并阻止用户对遮罩下层的内容进行操作&#xff0c;一般用于弹窗场景 #平台差异说明 AppH5微信小程序支付宝小程序百度小程…

Orika MapperFacade 对象属性复制在SpringBoot项目中的使用

文章目录 前言正文一、项目代码1.1 maven依赖1.2 核心配置文件1.3 时间工具类1.4 实体类1.5 转换对象的调用 二、MapperFacade API 前言 众所周知&#xff0c;在Java项目中经常会有用到各种对象属性复制的情况&#xff0c;以及从一个对象转换为另一个对象。 之前我们可能会使…

rust 泛型、多态

一&#xff0c;泛型 1&#xff0c;泛型函数 下面是一个手动实现vec翻转的例子&#xff1a; fn vector_reverse<T:Clone> (v:&Vec<T>)->Vec<T>{let mut ans Vec::new();let mut i v.len();loop {if i0{break;}i-1;ans.push(v[i].clone());}return…

没有外网Nginx如何配置如何开启https

判断是否支持open-ssl 在服务器执行如下命令 openssl version没有则安装open-ssl&#xff0c;由于服务器没有外网&#xff0c;可以离线安装openssl-3.0.1.tar.gz&#xff0c;我是在有网的服务器直接下载的&#xff0c;然后再上传到这台无网的服务器上 wget https://www.open…