“你这个查询写得真高级。”
“谢谢,其实是 .filter().select_related()。”


欢迎来到《摊牌系列》第三集,本期主题是——不会写 SQL 的我,全靠 ORM 活着。


🧠 我的第一条 SQL 是 ORM 生成的

大学学数据库那会儿,老师教我们写:

SELECT * FROM users WHERE age > 18 AND status = 'active';

我学完之后很久没用过,直到我接触了 Django,然后:

User.objects.filter(age__gt=18, status='active')

效果一样,但没有写 SQL!

那一刻我意识到:这不比 SQL 香?写起来优雅,还能链式调用!


🙈 为什么我怕写 SQL?

说真的,我不是没学 SQL,只是它太“真诚”了,一错就爆炸:

  • ❌ 写错字段名:报错
  • ❌ 忘记引号:报错
  • ❌ JOIN 忘了 ON 条件:查出来结果惊为天人(但都是错的)

而且:

  • JOIN 太烧脑:inner、left、right 每次写前都要百度区分
  • GROUP BY 一脸懵:聚合函数要配合 group by,不写报错,写了又不出数据
  • 分页写法超繁琐LIMIT ?, ? 到底谁是 offset 谁是 limit?
  • SQL 语法提示?Not Found! 除非你在用 DataGrip,否则别指望有提示

😎 ORM 才是信仰

ORM 让我仿佛拥有“数据库超能力”,它把晦涩难懂的 SQL 操作变成了“写 Python/JS 函数”。

ORM 与 SQL 对比表

ORM 操作 SQL 等价 说明
filter() WHERE 过滤记录
exclude() NOT 取反过滤
annotate() GROUP BY + 聚合 常用于统计
select_related() JOIN 优化 预加载外键关联
values() SELECT col 提取字段
order_by() ORDER BY 排序
distinct() DISTINCT 去重
exists() EXISTS 子查询 判断是否存在

💡 多表查询,从 SQL 地狱逃出生天

场景:查某用户下的所有订单金额大于 100 的记录

SQL:

SELECT o.*
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE u.name = '张三' AND o.amount > 100;

Django ORM:

Order.objects.filter(user__name='张三', amount__gt=100)

少了 ON、少了 SELECT、少了 alias,逻辑更清晰,错误更少。


🤡 “我会 SQL” 的社死瞬间

有一次我刚入职,信心满满跟 DBA 说:

“我 ORM 写得挺顺的,SQL 也会一些。”

DBA 笑笑说:

“那你写个:统计每个用户月度消费总额,按时间倒序展示,排除冻结用户。”

我稳稳地敲下:

from django.db.models.functions import TruncMonth
from django.db.models import Sum

User.objects.filter(status='active').annotate(
    month=TruncMonth('order__created_at'),
    total=Sum('order__amount')
).order_by('-month')

DBA 点点头说:“你这个我能翻译成 SQL 吗?”

我心虚笑笑:“你别翻,我也翻不出来……”


🧰 我的 ORM 小助手工具包

工具/插件 用法
Django Debug Toolbar 实时查看 ORM 查询生成的 SQL
SQLAlchemy + Alembic Python ORM + 数据迁移
Prisma Type-safe ORM(JS/TS 党的福音)
Beekeeper Studio / DBeaver 可视化管理数据库,补救 ORM 查询
DeepSeek / ChatGPT 用来生成或解释 SQL
Postico macOS 上最舒服的 PostgreSQL GUI

🧠 ORM 不是万金油(但我是 ORM 铁粉)

我知道 ORM 也有坑:

  • 自动生成的 SQL 有时效率堪忧
  • 大量数据批处理,用 ORM 会慢得像蜗牛(推荐 bulk_create / bulk_update)
  • 复杂场景(窗口函数、子查询嵌套),ORM 写起来绕得像八卦阵
  • ORM 抽象再强,也终究是“语法糖”

但!

只要它能让我写出业务代码、跑得起来、不写 SQL,我愿称它为“现代程序员的安眠药”


✅ 摊牌总结

  • ORM 是程序员的好朋友,能避开 80% 的 SQL 坑
  • 不会 SQL?用 ORM 也能查、能连表、能聚合、能分页
  • ORM 写起来像写代码,不容易写错、可读性更强
  • DeepSeek 能帮你生成 SQL,ORM 能帮你少写 SQL
  • 实在复杂的场景,找 DBA 合作一下就好,没必要逞强

ORM 在手,天下我有;
ORM 不灵,DeepSeek 救命;
ORM 太绕,DBA 上号!

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐