101
msg7086 2017-09-29 22:26:25 +08:00 1
@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 语句,只要不访问结果,便不会有查询。 |
103
syasuker 2017-09-29 23:19:59 +08:00
读写分开吧;读取的时候使用 sql 手写;写入的时候使用 ORM
|
104
aminic 2017-09-30 03:39:06 +08:00 via Android
看情况
|
105
yidinghe 2017-09-30 07:43:04 +08:00 via Android
orm 要学习的东西太多,结果并没有降低开发门槛。
|
106
StevenTong 2017-09-30 08:08:56 +08:00
微服务架构了 现在主要用 spring data jpa
|
107
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(); ``` 不过手写也很喜欢 |
108
onlyice 2017-09-30 10:34:47 +08:00
不会手写,喜欢 ORM,感觉可读可维护
而且很多 ORM 框架都提供了一些嵌入手写 SQL 的能力,这种灵活性可以 cover 住很多需求 |
109
moka20477 2017-09-30 11:23:37 +08:00
如果项目难度不大 ,而且开发人员水平参差不齐的话 ,就 ORM 吧,出现一条 SQL 搞挂数据库的概率小很多
要是有数据量很大,而且 SQL 比较复杂的话,还是手写吧,ORM 性能太差 |
110
RorschachZZZ 2017-09-30 12:37:31 +08:00
查询:手写。更新和插入:ORM。
|
111
mingyun 2017-11-26 10:29:18 +08:00
比如 laravel 的 orm 就很方便
|