Django之ORM与MySQL对比

这篇具有很好参考价值的文章主要介绍了Django之ORM与MySQL对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ORM 把类映射成数据库中的表,把类的一个实例对象映射成数据库中的数据行,把类的属性映射成表中的字段,通过对象的操作对应到数据库表的操作,实现了对象到SQL、SQL到对象的转换过程。

Django之ORM与MySQL对比,Python,Django,数据库,django,mysql,python,数据库
下面以一个商品库存明细表 myfirstapp_sku(包含商品编号、货号、颜色、尺码、库存属性字段),分别用ORM和sql语句对该表进行增删改查操作:
Django之ORM与MySQL对比,Python,Django,数据库,django,mysql,python,数据库

1. 创建表

  • ORM
 class Sku(models.Model):  # 模型类要继承models.Model
    sku = models.IntegerField(max_length=20, verbose_name="商品编号")
    goods_no = models.IntegerField(max_length=20, verbose_name="货号")
    co_val = models.CharField(max_length=20, verbose_name="颜色")
    si_val = models.CharField(max_length=20, verbose_name="尺码")
    sale_stock = models.IntegerField(max_length=20, verbose_name="库存")
  • MySQL
CREATE TABLE `myfirstapp_sku` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `sku` int unsigned NOT NULL AUTO_INCREMENT COMMENT '商品编号',
  `goods_no` int unsigned NOT NULL DEFAULT '0' COMMENT '货号',
  `co_val` varchar(50) NOT NULL DEFAULT '' COMMENT '颜色',
  `si_val` varchar(50) NOT NULL DEFAULT '' COMMENT '尺码',
  `sale_stock ` smallint unsigned NOT NULL DEFAULT '0' COMMENT '库存',
  PRIMARY KEY (`id`)) ;

2. 新增表数据

  • ORM
 Sku(sku='27347162', goods_no='1255600007', co_val='灰色', si_val='XS', sale_stock=88).save()
  • MySQL
INSERT INTO `myfirstapp_sku`(`sku`, `goods_no`, `co_val`, `si_val`, `sale_stock`) VALUES
 ( '27347162', '1255600007', '灰色', 'XS', 70);

3. 查询表数据(下面只列举了ORM)

  • 单条件查询
1. 查询某个条件下,表记录所有字段的值
Sku.objects.filter(sku='27347163').values()

2. 查询某个条件下,表记录某个字段的值
Sku.objects.filter(sku='27347163').values('goods_no')

3. 查询某个条件下,表记录某几个字段的值
Sku.objects.filter(sku='27347163').values('id','sku','goods_no')

补充:
1. Sku.objects.all()--查询表的所有对象
2. Sku.objects.get(sku='27347163')-- 若存在,则返回:Sku object (2);若不存在,则报错:Sku matching query does not exist.
3. Sku.objects.filter(sku='27347161').last()-- 若存在多条记录,查最后一条
4. Sku.objects.filter(sku='27347161').first()-- 若存在多条记录,查第一条
  • 多条件组合查询
# 查询颜色为咖色且尺码为L的所有记录
Sku.objects.filter(Q(co_val='咖色') & Q(si_val='L')).values()

# 查询颜色为咖色或颜色为米色的所有记录
Sku.objects.filter(Q(co_val='咖色') | Q(co_val='米色')).values()

# 查询【颜色为咖色或颜色为米色】且【尺码为L】的所有记录
Sku.objects.filter(Q(co_val='咖色') | Q(co_val='米色'),si_val='L').values()

# 获取sku='27347161'的个数
Sku.objects.filter(sku='27347161').count()
  • 大于/小于查询
******注:以下为双下划线_ _******

# 获取sale_stock大于1的值 
Sku.objects.filter(sale_stock__gt=1)   

# 获取sale_stock大于等于1的值
Sku.objects.filter(sale_stock__gte=1)    
  
# 获取sale_stock小于10的值        
Sku.objects.filter(sale_stock__lt=10)     

# 获取sale_stock小于等于10的值        
Sku.objects.filter(sale_stock__lte=10)  

# 获取sale_stock大于1且小于10的值           
Sku.objects.filter(sale_stock__gt=1, sale_stock__lt=10 )

  • 包含/不包含查询
# 获取sku 等于 27347161、27347163、27347164的数据
Sku.objects.filter(sku__in=[27347161, 27347163, 27347164])   

# 获取sku 不等于 27347161、27347163、27347164的数据,即 not in
Sku.objects.exclude(sku__in=[27347161, 27347163, 27347164]) 

# 模糊查询,查询尺码包含XS的数据
Sku.objects.filter(si_val__contains="XS")

# 模糊查询,查询尺码包含xs、XS、Xs、xS的数据
Sku.objects.filter(si_val__icontains="xs")   # icontains大小写不敏感

# 反向模糊查询,查询尺码不包含xs、XS、Xs、xS的数据
Sku.objects.exclude(si_val__icontains="XS") 

# 范围查询,查询库存在[1,10]的数据
Sku.objects.filter(sale_stock__range=[1, 10])
  • 分组查询
# 查询sku='27347161'所有记录并按照id升序
Sku.objects.filter(sku='27347161').order_by('id')    # asc

# 查询sku='27347161'所有记录并按照id降序
Sku.objects.filter(sku='27347161').order_by('-id')   # desc

# 查询索引在4到6(包含6)的记录
Sku.objects.all()[4:7]
  • 聚合查询
# 查询sku='27347161'所有记录,将相同的goods_no放在一组,返回goods_no、求和的sale_stock 
from django.db.models import Sum

result = Sku.objects.filter(sku=27347161).values('goods_no').annotate(total_sale_stock=Sum('sale_stock'))

for row in result:
    goods_no = row['goods_no']
    total_sale_stock = row['total_sale_stock']
    print(f"Goods No: {goods_no}, Total Sale Stock: {total_sale_stock}")
 
对应sql语句:SELECT goods_no, SUM(sale_stock) as total_sale_stock FROM myfirstapp_sku WHERE sku = 27347161 GROUP BY goods_no;

4. 修改表数据

  • 更新某个条件下,某个字段的值
# 方式1
Sku.objects.filter(sku='27347162').update(sale_stock=99)

# 方式2
sku_obj=models.Sku.objects.get(sku='27347162')
sku_obj.sale_stock=99
sku_obj.save()

对应sql语句:update myfirstapp_sku set sale_stock=99 where sku='27347162';
  • 统一修改表某一列的数据
******F(),可以获取对象中的字段的属性(列),并对其进行操作******
# 对每个sku的库存上调1件
Sku.objects.all().update(sale_stock=F('sale_stock')+1)

对应sql语句:update myfirstapp_sku set sale_stock = sale_stock + 1;

5. 删除表数据

  • ORM
Sku.objects.filter(sku='27347162').delete()
  • MySQL
delete from myfirstapp_sku  where sku='27347162'

从上面的增删改查代码实现来看,大部分场景ORM与sql语句在简易程度上都旗鼓相当,有些场景sql语句甚至更简洁、更直接,为何还要使用ORM呢???

其实当涉及到更复杂的业务逻辑和数据关联时,Django的ORM可以提供可读性更高的代码,而不需要开发者手动编写和维护复杂的SQL语句。举个栗子:

假设我们有三个模型(Model):User(用户)、Group(群组)和Membership(成员关系),一个用户可以加入多个群组,并且在每个群组中拥有一个角色。

  • 使用Django的ORM,可以通过以下方式来查询每个用户所属的群组及其角色:
python
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)

class Group(models.Model):
    name = models.CharField(max_length=100)

class Membership(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    role = models.CharField(max_length=100)

# 查询每个用户所属的群组及其角色
users = User.objects.all()
for user in users:
    memberships = Membership.objects.select_related('group').filter(user=user)
    for membership in memberships:
        print(f"用户名:{user.name},群组名:{membership.group.name},角色:{membership.role}")

ps:使用select_related方法进行关联查询,以避免N+1查询问题,然后使用filter方法过滤出每个用户的成员关系。最后,我们迭代每个用户的成员关系,并打印用户、群组和角色名称
  • 相比之下,如果使用Mysql直接操作数据库,需要编写更复杂的SQL语句来实现相同的功能:
# 该SQL语句使用了多个JOIN和别名(AS)操作来关联查询,并选择所需的字段。这样的SQL语句相对较长和复杂,且容易出错。
SELECT
    u.name,
    g.name AS group_name,
    m.role
FROM
    user u
JOIN
    membership m ON m.user_id = u.id
JOIN
    group g ON g.id = m.group_id;

6. 总结

从两者对数据库表的增删改查操作来看,Django的ORM操作数据库SQL语句直接操作数据库 确实存在一些相同点与不同点:

相同点:

  • 数据库操作:都可以进行常见的数据库增、删、改、查操作;
  • 连接方式:都需要建立与数据库的连接,以便进行数据交互;
  • 数据库支持:都支持各种主流数据库,包括MySQL、PostgreSQL、SQLite、Oracle等;

区别点:文章来源地址https://www.toymoban.com/news/detail-527210.html

  • 语法:Django的ORM使用类和方法的方式进行数据库操作,而Mysql直接操作数据库需要编写SQL语句。ORM提供了一种更加简洁、抽象和面向对象的数据库访问方式;
  • 复杂性:对于简单和快速的数据库操作,Mysql直接操作数据库可能更加直观和高效。但是对于复杂的业务逻辑和数据关联,Django的ORM能够提供更好的抽象和封装,简化开发流程,并且减少对SQL语句的依赖;
  • 数据库迁移:Django的ORM提供了数据库迁移工具,可以方便地进行数据库结构的变更和迁移。而Mysql直接操作数据库需要手动编写和执行SQL语句来实现数据库的变更;

到了这里,关于Django之ORM与MySQL对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【python】Django——连接mysql数据库

    笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 Django——连接mysql数据库 ORM(Object-Relational Mapping)是一种编程技术,它允许开发者使用面

    2024年02月04日
    浏览(55)
  • Django之ORM与MySQL对比

    ORM 把类映射成数据库中的表,把类的一个实例对象映射成数据库中的数据行,把类的属性映射成表中的字段,通过对象的操作对应到数据库表的操作,实现了对象到SQL、SQL到对象的转换过程。 下面以一个商品库存明细表 myfirstapp_sku (包含商品编号、货号、颜色、尺码、库存

    2024年02月12日
    浏览(35)
  • Python Django 之连接 Mysql 数据库详解

    博客:https://blog.csdn.net/qq_34745941/article/details/122549376 若已安装,请忽略。 主要使用的文件如图 若 pip 安装失败,可进入 Python 官方库中下载 whl 文件,操作可参考: 博客:https://blog.csdn.net/qq_34745941/article/details/106341898 在 settings.py 中,配置 Mysql 的连接串 扩展: Django 也支持其

    2024年02月04日
    浏览(52)
  • python+django+mysql项目实践二(前端及数据库)

    Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 添加模板 在templates下创建 views文件中添加 在setting文件中进行配置 在Terminal输入命令下发指令

    2024年02月14日
    浏览(58)
  • python在Django中,如何使用MySQL数据库进行分页怎么实现

    在Django中,使用MySQL数据库进行分页是一个相对简单的任务。Django的ORM提供了内置的分页功能,你只需要使用Paginator类即可。以下是一个基本的示例,展示了如何在Django中使用MySQL进行分页: 首先,确保你已经安装了Django和MySQL,并且已经配置了Django项目以使用MySQL数据库。

    2024年04月29日
    浏览(45)
  • django使用mysql数据库

    Django开 发操作数据库比使用pymysql操作更简单,内部提供了ORM框架。 下面是pymysql 和orm操作数据库的示意图,pymysql就是mysql的驱动,代码直接操作pymysql ,需要自己写增删改查的语句 django 就是也可以使用pymysql、mysqlclient作为驱动,但是目前对mysqlclient的支持更好,在驱动的基础

    2024年02月14日
    浏览(47)
  • Django的mysql数据库连接

    首先Mysql和navicate Premuim 已经安装好,并且可以建立数据库的连接,本次需使用的工具是 1、vs code 2、navicate Premuim 3、Mysql 打开vs code ,按Ctrl+ Shift + ~ ,调出vs code的终端界面,输入以下命令创建 test11 项目  django-admin startproject test11 (1)创建虚拟环境命令: 需要跳转到项目test1

    2024年02月05日
    浏览(59)
  • django框架——实现MySQL数据库数据的删除

    在html中的删除按钮中绑定js文件中的事件,带上参数,点击即触发(删除按钮不能是a链接,不然报错) js文件中实现该功能,发起ajax请求到后端视图中对数据库进行操作 路由导入 在视图里面实现删除功能

    2024年02月13日
    浏览(57)
  • Django操作MySQL数据库的优化方法

    Django 是一个很流行的 Web 框架,而 MySQL 是常用的关系型数据库之一。在使用 Django 开发 Web 应用时,我们经常需要使用 MySQL 存储数据,因此如何加速 MySQL 是我们需要关注的问题。本文将介绍一些方法来优化 Django 中 MySQL 的性能。 使用适当的索引 索引是 MySQL 中提高查询性能的

    2024年02月10日
    浏览(68)
  • MySQL数据库自动生成Models文件导入Django

    在Django项目使用数据库时,可以有三种方式:           1.直接编写app内的models文件,然后自动生成MySQL数据库          2.直接在MySQL中将数据库编写好,然后不使用models,而是在views中利用PyMySQL编写数据库链接等操作         3.MySQL库自动生成models文件进行连接使用 这

    2023年04月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包