数据库操作你是喜欢 ORM 还是手写 SQL

2017-09-28 19:58:12 +08:00
 twogoods
说说为什么?还有可以告诉我哪个语言下哪个库超好用吗?想多了解了解,尝试造个轮子,逃...
8740 次点击
所在节点    数据库
111 条回复
msg7086
2017-09-29 22:26:25 +08:00
@timwei 首先,where 方法返回 Relation,而 Relation 只有在访问其内容的时候才会产生 SQL 查询。
所以前面那个方法在最坏情况下也只会产生 2 条 SQL 查询,一条来自 empty?方法,会产生一个 COUNT(*) 语句,另一条来自 first 方法,会产生一个 LIMIT 1 语句。调用 where 方法是不会产生查询的。这是 Rails 3 里 Active Record 加入的惰性查询求值。

换句话说,如果一个 ORM 语句从来没有被访问到(比如 a = O.where.where.not.order 但是没有访问 a 的值),那就连一条 SQL 查询都不会产生。只有当你访问( empty? each map first select )的时候才会产生 SQL 查询。

在 pry/irb 下直接贴代码的时候,irb 会自动把变量的内容打印出来,打印行为就是对变量的访问,因此会产生额外的查询。封装在方法里的 ORM 语句,只要不访问结果,便不会有查询。
timwei
2017-09-29 22:31:20 +08:00
@msg7086

受教了
syasuker
2017-09-29 23:19:59 +08:00
读写分开吧;读取的时候使用 sql 手写;写入的时候使用 ORM
aminic
2017-09-30 03:39:06 +08:00
看情况
yidinghe
2017-09-30 07:43:04 +08:00
orm 要学习的东西太多,结果并没有降低开发门槛。
StevenTong
2017-09-30 08:08:56 +08:00
微服务架构了 现在主要用 spring data jpa
whatsmyip
2017-09-30 10:27:48 +08:00
[SQLBuilder]( https://github.com/newnius/util4p/blob/master/SQLBuilder.class.php)

自己造的小轮子,用 ORM 处于两个原因:

- 数据库间迁移方便
- 代码看起来舒服一点


```
$offset = $rule->getInt('offset', 0);
$limit = $rule->getInt('limit', -1);
$selected_rows = array('username', 'email', 'email_verified', 'role', 'reg_time', 'reg_ip');
$where_arr = array();
$builder = new SQLBuilder();
$builder->select('qa_user', $selected_rows);
$builder->where($where_arr);
$builder->limit($offset, $limit);
$sql = $builder->build();
```

不过手写也很喜欢
onlyice
2017-09-30 10:34:47 +08:00
不会手写,喜欢 ORM,感觉可读可维护

而且很多 ORM 框架都提供了一些嵌入手写 SQL 的能力,这种灵活性可以 cover 住很多需求
moka20477
2017-09-30 11:23:37 +08:00
如果项目难度不大 ,而且开发人员水平参差不齐的话 ,就 ORM 吧,出现一条 SQL 搞挂数据库的概率小很多
要是有数据量很大,而且 SQL 比较复杂的话,还是手写吧,ORM 性能太差
RorschachZZZ
2017-09-30 12:37:31 +08:00
查询:手写。更新和插入:ORM。
mingyun
2017-11-26 10:29:18 +08:00
比如 laravel 的 orm 就很方便

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/394442

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX