当前位置: 首页 > article >正文

Django models中的增删改查与MySQL SQL的对应关系

在 Django 中,models 提供了一种高层次的抽象来与数据库进行交互,使得开发者可以使用 Python 代码而非直接编写 SQL 来执行增删改查(CRUD)操作。下面将详细介绍 Django 的 ORM(对象关系映射)操作如何对应到 MySQL 的 SQL 查询。

创建 (Create)

Django Models:

# 创建并保存一个新对象
new_entry = MyModel(field1='value1', field2='value2')
new_entry.save()

MySQL SQL:

INSERT INTO myapp_mymodel (field1, field2) VALUES ('value1', 'value2');

读取 (Read)

获取单个对象

Django Models:

# 根据主键获取一个对象
entry = MyModel.objects.get(id=1)

MySQL SQL:

SELECT * FROM myapp_mymodel WHERE id = 1;
获取多个对象

Django Models:

# 获取所有对象
entries = MyModel.objects.all()

# 使用过滤条件获取对象
filtered_entries = MyModel.objects.filter(field1='value1')

MySQL SQL:

-- 获取所有对象
SELECT * FROM myapp_mymodel;

-- 使用 WHERE 子句过滤
SELECT * FROM myapp_mymodel WHERE field1 = 'value1';
聚合查询

Django Models:

from django.db.models import Count

# 统计总数
count = MyModel.objects.count()

# 分组统计
grouped = MyModel.objects.values('field1').annotate(count=Count('id'))

MySQL SQL:

-- 统计总数
SELECT COUNT(*) FROM myapp_mymodel;

-- 分组统计
SELECT field1, COUNT(id) AS count FROM myapp_mymodel GROUP BY field1;

更新 (Update)

Django Models:

# 更新单个对象
entry = MyModel.objects.get(id=1)
entry.field1 = 'new_value'
entry.save()

# 批量更新
MyModel.objects.filter(field1='old_value').update(field1='new_value')

MySQL SQL:

-- 更新单个对象
UPDATE myapp_mymodel SET field1 = 'new_value' WHERE id = 1;

-- 批量更新
UPDATE myapp_mymodel SET field1 = 'new_value' WHERE field1 = 'old_value';

删除 (Delete)

Django Models:

# 删除单个对象
entry = MyModel.objects.get(id=1)
entry.delete()

# 批量删除
MyModel.objects.filter(field1='value1').delete()

MySQL SQL:

-- 删除单个对象
DELETE FROM myapp_mymodel WHERE id = 1;

-- 批量删除
DELETE FROM myapp_mymodel WHERE field1 = 'value1';

高级查询

Django 的 ORM 还支持更复杂的查询,例如联合查询、子查询等,这些都可以通过 Django 的 Q 对象和 F 表达式来实现。对于非常复杂的查询,如果 ORM 不足以满足需求,Django 还允许直接执行原始 SQL 查询:

from django.db import connection

def custom_sql(query, params=None):
    with connection.cursor() as cursor:
        cursor.execute(query, params)
        return cursor.fetchall()

这使得您可以根据需要灵活地选择是使用 ORM 抽象还是直接编写 SQL 查询。

总之,Django 的 ORM 提供了一个强大而灵活的方式来与数据库交互,简化了数据访问层的开发工作,并且自动处理了许多底层细节,如事务管理、连接池等。同时,它也保持了足够的灵活性,以应对复杂的查询需求。


http://www.kler.cn/a/451680.html

相关文章:

  • Spring源码_05_IOC容器启动细节
  • 追风赶月莫停留,平芜尽处是春山—记一次备考经历(下)
  • Yolo11改策略:卷积改进|SAC,提升模型对小目标和遮挡目标的检测性能|即插即用
  • postgresql ERROR: cannot drop the currently open database
  • Springboot + vue3 实现大文件上传方案:秒传、断点续传、分片上传、前端异步上传
  • RabbitMQ中的Topic模式
  • leetcode hot100 环形链表2
  • 深度学习环境安装
  • 内网穿透玩法之京东云亚瑟路由器刷神卓互联教程
  • 树莓集团:以产教融合助力人才培养
  • yii2 手动添加 phpoffice\phpexcel
  • 开放世界目标检测 Grounding DINO
  • 机器人C++开源库The Robotics Library (RL)使用手册(一)
  • CentOS7下的vsftpd服务器和客户端
  • 基于推理的目标检测 DetGPT
  • Python选择题训练工具:高效学习、答题回顾与音频朗读一站式体验
  • 如何将excel表格内的日期自动更新为当天,一个公式就OK了
  • Docker服务发现新纪元:探索Consul的无限魅力
  • Flink SQL Cookbook on Zeppelin 部署使用
  • 赛灵思ZYNQ系列的启动过程分析
  • AIA - IMSIC之二(附IMSIC处理流程图)
  • LeetCode 203. 移除链表元素 (C++实现)
  • CSES-1132 Tree Distances I(树的直径)
  • 云宏获亚太信息通讯科技大赛二等奖
  • 【河南新标】豫财预〔2024〕105号-《关于省级政务信息化建设项目支出预算标准的规定》-费用标准解读系列29
  • 线性代数期末总复习的点点滴滴(1)