connection.cursor() 与 models.objects.filter

在 Django 中操作数据库时,connection.cursor() 和 models.objects.filter 是两种不同的方式,各有特点和适用场景:

  1. models.objects.filter (ORM 方式)

特点‌:

基于 Django 的 ORM(对象关系映射)框架,无需直接编写 SQL 语句。

支持链式调用,可结合 Q 对象实现复杂查询(如 OR 条件)。

自动处理数据库兼容性和安全性(如防 SQL 注入)。

返回的是 QuerySet 对象,支持惰性查询和分页优化。

示例‌:

css 复制代码
python
Copy Code
from app.models import Blog
# 简单查询
blogs = Blog.objects.filter(name='test').order_by('-ctime')  
# 使用 Q 对象
from django.db.models import Q
blogs = Blog.objects.filter(Q(id=1) | Q(name__contains='django')):ml-citation{ref="5" data="citationList"}
  1. connection.cursor() (原生 SQL 方式)

特点‌:

直接执行原生 SQL 语句,适合复杂查询或 ORM 无法高效实现的场景。

需手动管理游标和连接,灵活性高但代码更底层。

需注意 SQL 注入风险,推荐使用参数化查询(如 cursor.execute(sql, params))。

示例‌:

css 复制代码
python
Copy Code
from django.db import connection
with connection.cursor() as cursor:
    cursor.execute("SELECT * FROM blog_blog WHERE id = %s", [1])  
    rows = cursor.fetchall():ml-citation{ref="2,6" data="citationList"}

对比总结

对比项‌ models.objects.filter connection.cursor()

适用场景‌ 常规查询、ORM 支持的操作 复杂 SQL、性能优化需求

安全性‌ 自动防注入 需手动参数化处理

可维护性‌ 高(代码与数据库解耦) 低(依赖具体数据库语法)

性能优化‌ 支持 select_related 等优化 可直接优化 SQL 语句

建议‌:优先使用 ORM 方式,仅在 ORM 无法满足需求时使用原生 SQL。

相关推荐
王九思9 分钟前
对称加密与非对称加密详解
java·网络·数据库
周杰伦的稻香11 分钟前
(1071, ‘Specified key was too long; max key length is 767 bytes‘)
数据库·mysql
Leo.yuan26 分钟前
数据目录和数据字典有什么区别?一文讲清
大数据·数据库·人工智能
全堆鸿蒙28 分钟前
鸿蒙应用开发实战【37】— 数据统计:countByStatus 聚合查询
数据库·华为·harmonyos·鸿蒙系统
惜分飞30 分钟前
记录block 0损坏,数据文件大量坏块,使用不当数据库版本恢复等各种操作之后的故障处理---惜分飞
数据库·block0损坏·ora-17503
执笔论英雄35 分钟前
【大模型推理】redis kv cache
数据库·redis·缓存
tiancaijiben1 小时前
阿里云SAE应用引擎弹性扩缩容完全指南:从手动调控到智能自动化
java·网络·数据库
倔强的石头_1 小时前
8000 条 SQL 里,180 条外连接语义跑偏——Oracle 迁 KES 那些藏得最深的坑
数据库
逆境不可逃1 小时前
RAG 不只是向量数据库:讲透 Chunk、混合检索、重排、引用与权限治理
数据库·oracle
全堆鸿蒙2 小时前
鸿蒙应用开发实战【36】— 数据查询优化:predicates 链式调用
数据库·harmonyos·鸿蒙系统