要写个关联查询,研究 api 研究了半天,不能忍,我还是直接写个 sql 吧,换个 orm 框架 api 接口又不一样了,只有 sql 语句是不变的。
![]() | 1 IvanLi127 2022-05-30 21:09:38 +08:00 via Android 换了数据库语句不一样了也不是什么好事。ORM 和 SQL 有啥区别应该网上有资料可查,你可以看看。我觉得问题不能局限在写查询上。 |
![]() | 2 helone 2022-05-30 21:11:28 +08:00 就我个人而言,复用代码、语义清晰 |
![]() | 3 XCFOX 2022-05-30 23:08:12 +08:00 ![]() 当然首要是为了类型安全 (Type Safety),然后才是防止 SQL 注入、逻辑复用。 ORM 的一个重要功能就是将 数据库 里的表结构 转化为 对应语言的 Entity (Persistant Object)。 如果不使用 ORM 的话,用 SQL 从库里捞出来的数据得手动加类型断言,这个类型断言得随着每次 SQL 改动或者 表结构而变动,非常不容易维护。 ORM 的另一个功能也是 api 代替 sql 语句的重要意义是:API 抹平了不同数据库之间的差异。比如 mikro-orm( https://mikro-orm.io/),同一套 API 支持了 MongoDB, MySQL, MariaDB, PostgreSQL and SQLite 。用楼主的话说就是换个 数据库 SQL 语法 又不一样了 ,只有 ORM 的 API 是不变的。 我个人不喜欢 GoLang 的一个重要原因就是 Go 的多数 Orm 因为语言的缺陷无法实现完善的类型安全(对比 TypeScript 的 TypeORM 、C# 的 Entity Framework Core )。同样我也不喜欢 Java 的 mybatis 。 |
img src="https://cdn.v2ex.com/static/img/avatar_normal.png" class="avatar" border="0" align="default" alt="F281M6Dh8DXpD1g2" data-uid="27647" /> | 4 F281M6Dh8DXpD1g2 2022-05-30 23:39:40 +08:00 via iPhone ![]() 说 orm 可以屏蔽掉数据库之间差异的是认真的么 |
5 jhdxr 2022-05-31 00:35:37 +08:00 @liprais 我觉得这么说没啥问题啊。( web 场景下)大部分 CRUD 用 ORM 的确可以抹平不同 DB 之间的差异。每个 DB 独有的一些高级特性基本上也没法用 ORM 。 |
![]() | 6 xiangyuecn 2022-05-31 07:51:53 +08:00 确实。简单的 sql ,不改也能不同数据库执行。复杂的,只能呵呵 |
![]() | 7 waising 2022-05-31 09:08:18 +08:00 除了开源的框架项目,现实业务项目有很多要切换同类数据库的场景吗? |
8 terranboy 2022-05-31 09:18:19 +08:00 可以写 SQL 大多数情况 用 ORM 更方便 更安全 |
9 wdwwtzy 2022-05-31 09:23:41 +08:00 via iPhone 你的这个问题其实正是使用 ORM 的意义之一 |
10 fanyingmao OP 总结下,就是简单的语句可以用 orm 方便,复杂的还是自己写 sql 吧,我写 sql 一点点用子语句调,比用 api 效率高多了。 |
11 qrobot 2022-05-31 11:26:13 +0800 @XCFOX #3L 很有意思的一个点,ORM 支持的 sql 也支持,sql 不支持的查询 orm 同样不支持。 所以 orm 到底好在什么地方? 我认为 sql 和 orm 最大的区别 - 缓存 (查询 /修改) - 可通过 entity 自动生成 insert into 或者 update 等语句,比自己手写会方便很多 至于关系性数据库的设计用 orm 作为查询, 简直就是反人类。当然 orm 提倡数据在中间层中进行查询使用,而不是在 sql 中直接提取完成 |
![]() | 12 XCFOX 2022-05-31 14:21:41 +08:00 ORM 的类型安全还体现在查询条件的处理上。 比如对于一个 有 Age(Int) 字段的 User 表: 不使用 ORM:select * from User where age > 233 、select * from User where age > haha |
![]() | 13 XCFOX 2022-05-31 14:27:41 +08:00 ORM 的类型安全还体现在查询条件的处理上。 比如对于一个 有 Age(Int) 字段的 User 表: 不使用 ORM:select * from User where age = 233 、select * from User where age = haha , 这两句在代码里实际上是字符串,都不会报错 使用 TypeORM:const user = await userRepository.findOneBy({ age: 233})、const user = await userRepository.findOneBy({ age: 'haha' }),TypeScript 能告诉你第二句的参数是非法的 使用 gorm: db.Where("age = ?", "22").Find(&users)、db.Where("age = ?", "haha").Find(&users),go 语言并不能判断第二句的输入有问题。 |
14 yekai584341028 2023-02-16 16:35:51 +08:00 typeORM 可以自动同步数据库和实体类的结构,数据表升级、回退只需要改实体类。当然自动修改列类型、删除列有点危险。 |