当前位置:首页 > 综合 > orm是什么

orm是什么

2026-10-17 05:33:17 [焦点] 来源:力不从心网
```html

你写PHP的时候,有没有想过为什么取一条用户数据要写SELECT * FROM users WHERE id = 1,而不是直接告诉数据库“把id为1的用户给我”?因为你得用数据库能听懂的话。ORM就是帮你翻译的那层东西。

ORM,全称Object-Relational Mapping,对象关系映射。名字听着唬人,拆开看就明白了。Object——你代码里的对象,比如一个User类实例。Relational——关系型数据库,就是MySQL、PostgreSQL那种用表存数据的。Mapping——把这两者对应起来。说白了,ORM让你用操作对象的方式去操作数据库,不用手写SQL。

拿Django举例。你定义一个模型类:

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

然后User.objects.get(id=1)就能拿到数据。背后Django帮你生成了SQL,执行,再把结果集包装成User对象返回。你全程没碰过SELECT关键字。

我第一次接触ORM是2013年,用Ruby on Rails。当时觉得这东西太方便了,一行User.find_by(email: 'a@b.com')就搞定查询。但很快踩了坑——循环里调用关联对象的属性,控制台刷出几百条SQL,页面慢得像蜗牛。这叫N+1查询问题,ORM的经典陷阱。你写的是user.posts.each,ORM却为每个user单独发一条查posts的SQL。后来学会用includes预加载才解决。

ORM的好处很直接。写代码快,不用在语言和SQL之间来回切换思维。数据库移植也方便,换MySQL到PostgreSQL,大部分情况改个配置就行。还有安全性,参数化查询自动处理,SQL注入风险低很多。团队协作时,模型定义就是文档,看类结构就知道表长什么样。

但代价也不小。复杂查询是ORM的软肋。多表JOIN、子查询、窗口函数,用ORM写出来往往比原生SQL还长,可读性更差。性能上,ORM生成的SQL不一定最优。我见过一个统计查询,ORM拼出来的SQL跑了3秒,手写优化后0.1秒。还有“对象-关系阻抗失配”这个老问题——继承怎么映射?多对多怎么处理?不同ORM有不同方案,没有银弹。

所以实际项目里,常见做法是混合使用。简单CRUD走ORM,复杂报表和批量操作直接写SQL。Django有raw(),SQLAlchemy有text(),Rails有find_by_sql。别跟工具较劲,该绕过就绕过。

选ORM也有讲究。Hibernate适合企业级Java项目,功能全但学习曲线陡。MyBatis更轻,SQL写在XML里,控制力强。Python这边,Django ORM跟框架绑死,SQLAlchemy更灵活。Node.js的Prisma这几年势头猛,类型安全做得好。没有哪个最好,看团队习惯和项目需求。

有个现象挺有意思。很多新手把ORM当黑盒,从不看它生成的SQL。遇到慢查询就懵了。我的建议是,开发阶段打开SQL日志,看看ORM到底在干什么。Django的connection.queries,Rails的ActiveRecord::Base.logger,都能帮你看到底层。理解ORM在做什么,比会用API更重要。

ORM不是必须的。小项目、简单查询,直接写SQL可能更清爽。但项目一大,模型一多,ORM带来的结构化和可维护性优势就出来了。它像自动挡汽车,日常驾驶省心,但想跑赛道还是得手动换挡。

```

(责任编辑:热点)

推荐文章
  • 补差价链接怎么发布

    补差价链接怎么发布 淘宝卖家老周上周差点被一个补差价链接坑了。客户拍下后一直没付款,他催了三次才发现,自己把“单拍”和“多拍”的库存搞混了,链接根本拍不了。这种破事,干电商的都懂。 补差价链接的核心就一句话:让买家能顺利 ...[详细]
  • 登录银行网站显示网页丢了怎么办

    登录银行网站显示网页丢了怎么办 昨天下午三点十七分,我正打算转一笔房租,浏览器里输好网址,回车——白屏。中间一个灰色小框,写着“此网站无法访问”。我第一反应是银行系统又升级了,第二反应是完了,这个月水电费要逾期。后来折腾了二十分钟才 ...[详细]
  • 如何测试外网是否稳定

    如何测试外网是否稳定 外网稳不稳,别信运营商客服那句“我们这边显示正常”。我自己被坑过三次之后,总结出一套土办法加专业工具结合的测试流程,十分钟能出结果。 第一步,先ping网关,再ping公网IP。很多人一上来就ping ...[详细]
  • put away

    put away 我父亲去世那年,我整理他的遗物。抽屉最底层压着一块老式上海手表,表带断了,用橡皮筋勉强箍着。表盘上有一道细长的裂纹,像干涸河床上的裂缝。我拿起来,表针纹丝不动。但我知道它曾经走得极准——小时候我总趴在 ...[详细]
  • 大城主战略版最强武将

    大城主战略版最强武将 《大城主战略版》里武将上百个,真正能扛起“最强”二字的,从来不是面板数值最高的那几位。我玩了七个赛季,见过满红大佬被平民队按在地上摩擦,也见过零充党用紫将逆袭翻盘——这游戏的核心从来不是“谁厉害”,而 ...[详细]
  • 有的网页打不开但是有网什么原因

    有的网页打不开但是有网什么原因 我正赶着交一份方案,浏览器却转起了圈圈。微信消息一条条蹦出来,视频通话也清晰流畅——网是通的。可那个要命的网页,就是死活打不开。 这种场景太熟悉了。你盯着那个加载失败的页面,刷新了七八遍,甚至把路由器 ...[详细]
  • typecho小程序

    typecho小程序 Typecho小程序这事儿,我得说点大实话。去年帮朋友折腾他的个人博客,后台挂着Typecho,前台想弄个小程序端,结果网上一搜教程,全是三年前的旧文,插件市场里的小程序方案要么停更,要么就是个半成品 ...[详细]
  • 网络私活接单平台

    网络私活接单平台 老周上个月被公司优化了,35岁,Java后端,简历投出去几十份,面试通知寥寥无几。他在技术群里吐槽,有人甩给他一个链接——某私活接单平台的注册入口。老周犹豫了三天,最终还是注册了。他告诉我,第一周完全 ...[详细]
  • 襄阳人才网

    襄阳人才网 襄阳人才网的首页,一眼扫过去,密密麻麻的职位列表。我点开一个“新媒体运营”,要求三年经验、会剪辑、懂投放,月薪写着“4k-8k”。这个区间挺微妙,像极了襄阳这座城市的定位——有野心,但底气不足。 我认 ...[详细]
  • 如何防止ddos攻击

    如何防止ddos攻击 如何防止DDoS攻击 2023年某天凌晨三点,我的一个做电商的朋友打来电话,声音发颤:“网站打不开了,后台数据全乱,客服电话被打爆。”他以为被黑客勒索,查了半天才发现,是竞争对手雇人用“打流量”的方式 ...[详细]
热点阅读