公司最近接了个电商后台系统,时间紧任务重,团队里有人提议用 Django 的 ORM 来操作数据库。起初我还有点犹豫,毕竟以前都是直接写 SQL,总觉得那样更“踏实”。但这次尝试下来,确实感觉开发节奏快了不少。
不用再反复核对字段名
以前写原生 SQL,最怕的就是拼错字段名。比如用户表改了个字段叫 user_status,结果你在某个查询里还写着 status,运行时报错还得回头翻表结构。用了 ORM 之后,这些字段都变成了类属性,IDE 能自动提示,写错了当时就能发现。
class User(models.Model):
name = models.CharField(max_length=100)
user_status = models.IntegerField(default=0)
# 查询活跃用户
users = User.objects.filter(user_status=1)
增删改查代码变短了
比如要新增一条订单记录,原来得拼一段 INSERT 语句,参数一个一个对应。现在只需要实例化一个对象,调 save() 就行。
order = Order(
user_id=123,
product_name='无线耳机',
amount=299.00
)
order.save()
看着简单,但在接口多、模型频繁变动的项目里,这种简洁带来的效率提升是实实在在的。
复杂查询也能应付
有人担心 ORM 写不了复杂查询,其实像多表关联、聚合统计这些,主流 ORM 都支持。Django ORM 的 annotate() 和 Q 对象处理起来挺顺手。虽然极端复杂的报表查询还是得写原生 SQL,但这类场景占比并不高。
from django.db.models import Count
# 统计每个用户的订单数
user_order_count = User.objects.annotate(
order_count=Count('order')
).values('name', 'order_count')
团队新人上手快
新来的小张刚毕业,对 SQL 不熟,但 Python 还行。用了 ORM 后,他两天就搞定了用户管理模块。如果让他直接拼 SQL,估计光调试就得花好几天。这对项目进度来说,也是一种效率提升。
当然也有坑
不是所有情况都适合。有一次我们做批量导入,用 ORM 一条条 save(),结果跑了二十分钟。换成原生 SQL 的 bulk_insert,不到一分钟搞定。性能敏感的场景,还是得权衡。
另外,ORM 抽象得太深,有时候生成的 SQL 并不高效,得用 explain 去查执行计划。不了解底层的人容易写出慢查询,以为是框架问题,其实是用法不对。
它更像是个“加速器”
就像电动车帮你省力,但你还是得会骑车。ORM 能减少重复劳动,让开发者更专注业务逻辑。但它不能代替对数据库的理解。该建索引的地方不能偷懒,该拆表的时候也不能硬撑。
在我们这个项目里,大概 80% 的数据操作用 ORM 完成,剩下的 20% 性能关键或特别复杂的,混合使用原生 SQL。整体开发速度比之前纯手写 SQL 快了至少三成。