V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
maotao456
V2EX  ›  问与答

自从学了 Go 之后对 ORM 就越来越无感了

  •  
  •   maotao456 · 2022-09-06 10:08:02 +08:00 · 7144 次点击
    这是一个创建于 838 天前的主题,其中的信息可能已经有所发展或是发生改变。

    第一门开发语言是 PHP ,尤为喜欢 Laravel 里面的 ORM , 后来学了 Go ( sqlx ),反而觉得 ORM 这种东西没啥用处,还不如手写 SQL 来得快和直观。

    现在写回 PHP ,都是直接 PDO 了。

    41 条回复    2022-09-07 10:41:56 +08:00
    so1n
        1
    so1n  
       2022-09-06 10:14:02 +08:00
    写了几年一直不习惯 ORM
    wangkun025
        2
    wangkun025  
       2022-09-06 10:14:52 +08:00   ❤️ 6
    写 Ruby 就会觉得 ORM 爽了。
    amirobotics
        3
    amirobotics  
       2022-09-06 10:15:43 +08:00
    十字螺丝能够被扁平螺丝起子开启,但扁平螺丝不能被十字螺丝起子开启。

    就是一个工具,能快速完成任务才是真理。
    lululau
        4
    lululau  
       2022-09-06 10:18:33 +08:00   ❤️ 15
    最烦“就是个工具”这句话了,什么东西不是工具,都是工具咋不用汇编写呢
    hefish
        5
    hefish  
       2022-09-06 10:19:11 +08:00
    我怎么觉着 EloquentORM 挺爽的,是我碰到的最合适的 PHP 的 ORM 了。
    主要是以对象的方式存取数据方便,如果只是取部分字段之类的,那确实 PDO 更直接,省事。
    micean
        6
    micean  
       2022-09-06 10:21:21 +08:00
    orm 很适合写后台查询
    charlie21
        7
    charlie21  
       2022-09-06 10:26:43 +08:00
    orm 是方便使用不同数据库 比如 开发环境数据库 sqlite 生产环境用 mysql 这个时候有 orm 最简单 抹平 /让人不必再关心各个数据库差异
    wonderfulcxm
        8
    wonderfulcxm  
       2022-09-06 10:30:13 +08:00 via iPhone
    我一直觉得手写 SQL 不麻烦,但很多框架都用 orm ,那就用呗。
    lp7631010
        9
    lp7631010  
       2022-09-06 10:31:38 +08:00
    发明锄头 未必还用石块和木棍去刨土 刨的有感觉些?
    daimubai
        10
    daimubai  
       2022-09-06 10:34:15 +08:00   ❤️ 2
    没有做过数据报表吗?十几个表一起查的那种
    wakaka
        11
    wakaka  
       2022-09-06 10:46:16 +08:00
    Go 语言写 CRUD 过于繁琐无趣
    www5070504
        12
    www5070504  
       2022-09-06 10:52:28 +08:00   ❤️ 1
    go 写 web 略显无趣 写 curd 更无聊
    Dogtler
        13
    Dogtler  
       2022-09-06 10:58:53 +08:00
    Go 写 CURD 是真不如 PHP 。
    得找点并发场景,否则算不上熟练掌握 Go
    ipwx
        14
    ipwx  
       2022-09-06 11:03:52 +08:00
    ummm 现代语言的 ORM 不都能联通 API 请求解析 + 类型校验嘛。。。

    结构体一复杂,手动处理这些都很麻烦。
    ihipop
        15
    ihipop  
       2022-09-06 11:07:27 +08:00 via Android   ❤️ 5
    这是因为 go (部分是语言层面限制)没有和 eloquentorm 一样好用的 ORM
    我也写 go ,但是没有冒犯的意思,这就好像和太监没有了性器官一样,说还是清心寡欲对身体好啊一样的。
    tianyou666shen
        16
    tianyou666shen  
       2022-09-06 11:21:13 +08:00
    只要不写一条占满整个屏幕的 sql 一把梭都是挺快的
    lambdaq
        17
    lambdaq  
       2022-09-06 11:21:19 +08:00   ❤️ 4
    觉得 CURD 没用的,肯定是业务不够复杂

    比如传入参数 a 要生根据值成不同的语句,传入 b 要根据 a 的值联动生成不同的查询。

    拼 sql 不拼死你。一堆 if else 。。。
    fiypig
        18
    fiypig  
       2022-09-06 11:24:49 +08:00
    我用 GORM 也够用啊
    QlanQ
        19
    QlanQ  
       2022-09-06 12:48:49 +08:00
    那只是因为 go 的 orm 不好用罢了,orm 如果需要增加 软删除,只需要 在 模型里面加一个定义就好了,手撸的,你所有的相关 sql 都要检查一遍,临时增加事件也很好用
    hwv2e
        20
    hwv2e  
       2022-09-06 13:44:20 +08:00 via Android
    go 里面 gorm 的确很难用。
    但 go 也有好用的 orm ,ent 了解一下,Facebook 开源的,超级好用,任何 sql 语句都不用写(连条件也不需要写 sql )。
    hwv2e
        21
    hwv2e  
       2022-09-06 13:45:09 +08:00 via Android
    @fiypig ent 了解一下
    xz410236056
        22
    xz410236056  
       2022-09-06 14:12:23 +08:00
    1 、写 sql 不怕写错吗?
    2 、你有没有想过,ORM 的代码大多都是自动生成的?
    anzu
        23
    anzu  
       2022-09-06 14:27:54 +08:00
    喜欢手写 sql 是吧,什么时候表加字段、改字段名、改字段类型的时候……
    yrzs
        24
    yrzs  
       2022-09-06 15:04:14 +08:00
    @hwv2e 确实,go 里最喜欢 ent
    YUyu101
        25
    YUyu101  
       2022-09-06 15:53:24 +08:00   ❤️ 1
    手写 sql ,然后碰到根据参数查不同表不同字段的情况下,字符串拼接会很蛋疼,最后不得不造一套 dsl 出来。
    fyooo
        26
    fyooo  
       2022-09-06 16:04:29 +08:00
    ent +1
    bigpigB
        27
    bigpigB  
       2022-09-06 16:33:42 +08:00
    @lululau 说这句话只是为了显得自己有 B 格,你让他不用工具他就跟你急
    arvin01
        28
    arvin01  
       2022-09-06 17:06:49 +08:00
    ent +1
    wdwwtzy
        29
    wdwwtzy  
       2022-09-06 17:26:09 +08:00
    其实 orm 还有一个很重要的作用,就是在编译期发现问题,你写 sql 只能在运行时才发现问题
    nosugar
        30
    nosugar  
       2022-09-06 17:54:14 +08:00
    ORM 好用,大几十张表你就知道了,写 SQL 改起来很麻烦
    maotao456
        31
    maotao456  
    OP
       2022-09-06 18:33:42 +08:00
    @wdwwtzy 我说一下我的体验,ORM 不能消除 SQL 错误,但是手写 SQL 可以先在 Mysql 客户端里面执行了再复制到代码里面,相当于直接调试。 ORM 则是你要程序跑起来才知道写得对不对。
    maotao456
        32
    maotao456  
    OP
       2022-09-06 18:34:16 +08:00
    @daimubai 这种不应该是手写 SQL 最快,且最容易验证的吗?
    maotao456
        33
    maotao456  
    OP
       2022-09-06 18:36:11 +08:00
    @lambdaq if else 是不能消除的,用不用 ORM 都一样(可能我用过的不好), 以一个管理后台为例子:

    if (isset($request->name)) {
    $orm->where('name', $request->name);
    }

    这样的 if 是无法消除的。
    maotao456
        34
    maotao456  
    OP
       2022-09-06 18:37:30 +08:00
    @xz410236056 SQL 错没错,直接在客户端执行一下就知道了。这不是来得更快吗?
    maotao456
        35
    maotao456  
    OP
       2022-09-06 18:39:05 +08:00
    @YUyu101 这个我承认,不过我现在的做法就是多表联查的聚合数据都用 搜索引擎来替代。也就是管理后台的大部分数据都用搜索引擎来做, 自己写一段不用 SQL 的方法同步数据就好了。
    abcd191898105
        36
    abcd191898105  
       2022-09-06 19:15:08 +08:00 via iPhone
    orm 的在于规范,直接写 sql 格局太小。php 弱类型当然无所谓。
    wdwwtzy
        37
    wdwwtzy  
       2022-09-06 19:46:31 +08:00
    @maotao456 不是啊,ORM 编译期就发现错误了啊,例如你 sql 改其他代码时不小心多加了一个字母 "select * from studenta",你是不知道错误的,只有运行时才能发现,但是 orm 就可以在编译器发现了 db.student.select(),你多加个字母是编译不过的。
    dobelee
        38
    dobelee  
       2022-09-06 20:02:13 +08:00 via iPhone
    where 多的话还是 orm 比较简单。如果是用户端相对简单、稳定的查询,sql 就够了。
    Biexl
        39
    Biexl  
       2022-09-06 22:46:37 +08:00
    maotao456
        40
    maotao456  
    OP
       2022-09-07 09:59:41 +08:00
    @Biexl 感谢,这个正是我需要的
    lambdaq
        41
    lambdaq  
       2022-09-07 10:41:56 +08:00
    @maotao456 但是这样写起来更顺滑啊。不会因为拼 sql 的时候多了少了个字符串导致神奇的 bug 。。。。而且还把类型自动给你搞对了。

    写 orm 语句:只需要考虑业务逻辑
    直接写 sql:考虑业务的同时,需要兼顾查询语法是否通顺

    后者搞多了心智负担会很重。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2577 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:53 · PVG 13:53 · LAX 21:53 · JFK 00:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.