自从学了 Go 之后对 ORM 就越来越无感了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
maotao456
V2EX    问与答

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

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

    第一门开发语言是 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 爽了。
    TDWPFk2IRMJPSRae
        3
    TDWPFk2IRMJPSRae  
       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     Solana     819 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 21:27 PVG 05:27 LAX 13:27 JFK 16:27
    Do have faith in what you're doing.
    /div>
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86