V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
twogoods
V2EX  ›  数据库

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

  •  
  •   twogoods · 2017-09-28 19:58:12 +08:00 · 8977 次点击
    这是一个创建于 2644 天前的主题,其中的信息可能已经有所发展或是发生改变。
    说说为什么?还有可以告诉我哪个语言下哪个库超好用吗?想多了解了解,尝试造个轮子,逃...
    第 1 条附言  ·  2017-09-28 20:43:00 +08:00
    orm 最主要的功能是关系数据映射称为程序中的对象,那类似 hibernate 这种多表,各种关联关系都可以进行映射的功能会用的多吗?动态 sql 需求也是非常常见的,你们怎么处理的,哪个库有比较好的支持?
    111 条回复    2017-11-26 10:29:18 +08:00
    1  2  
    msg7086
        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 语句,只要不访问结果,便不会有查询。
    timwei
        102
    timwei  
       2017-09-29 22:31:20 +08:00 via Android
    @msg7086

    受教了
    syasuker
        103
    syasuker  
       2017-09-29 23:19:59 +08:00
    读写分开吧;读取的时候使用 sql 手写;写入的时候使用 ORM
    aminic
        104
    aminic  
       2017-09-30 03:39:06 +08:00 via Android
    看情况
    yidinghe
        105
    yidinghe  
       2017-09-30 07:43:04 +08:00 via Android
    orm 要学习的东西太多,结果并没有降低开发门槛。
    StevenTong
        106
    StevenTong  
       2017-09-30 08:08:56 +08:00
    微服务架构了 现在主要用 spring data jpa
    whatsmyip
        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();
    ```

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

    而且很多 ORM 框架都提供了一些嵌入手写 SQL 的能力,这种灵活性可以 cover 住很多需求
    moka20477
        109
    moka20477  
       2017-09-30 11:23:37 +08:00
    如果项目难度不大 ,而且开发人员水平参差不齐的话 ,就 ORM 吧,出现一条 SQL 搞挂数据库的概率小很多
    要是有数据量很大,而且 SQL 比较复杂的话,还是手写吧,ORM 性能太差
    RorschachZZZ
        110
    RorschachZZZ  
       2017-09-30 12:37:31 +08:00
    查询:手写。更新和插入:ORM。
    mingyun
        111
    mingyun  
       2017-11-26 10:29:18 +08:00
    比如 laravel 的 orm 就很方便
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3172 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:34 · PVG 20:34 · LAX 04:34 · JFK 07:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.