关于 sqlx 等的纯 sql 库的不解的一点 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
jam1024
V2EX    Go 编程语言

关于 sqlx 等的纯 sql 库的不解的一点

  •  
  •   jam1024 2022-06-24 20:06:52 +08:00 2634 次点击
    这是一个创建于 1212 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 go 节点一说到 orm 相关的,很多人都说 自己用 sqlx+sql builder 类似的库,或推荐类似库

    但有个疑问就是 sqlx 这类的东西如何实现关联查询,比如一对一、一对多的模型关系,并且是易于使用的关联查询

    然后就是项目复杂后,数据库的访问也变的复杂。这类简易库真的能在生产环境里高效开发吗,更容易开发吗?最终是不是还会自己整出个简易的 orm 库,那为何不一开始就用 orm 的库呢?

    acehowxx
        1
    acehowxx  
       2022-06-24 20:58:50 +08:00 via Android
    关联查询自己写 left join 呗。orm 并非那么不可获缺。习惯哪个用哪个,都一样。高效不高效的,都是 crud ,谁能比谁差哪去,又不是搞量子计算机 ai 飞升的谷歌 fellow.
    jam1024
        2
    jam1024  
    OP
       2022-06-24 22:40:27 +08:00
    @acehowxx 我个人感觉不应该一上来推崇纯 sql 的方式挖坑,就像要啥 vue, 要啥 react, 直接纯 js 写不香吗。别人对数据的访问封装库的存在就是解决数据沟通上的痛点,存在即有道理。
    yrj
        3
    yrj  
       2022-06-25 03:00:48 +08:00
    @jam1024 有时候直接用 sql 写反而是更舒服的,只是用 sqlx 解决防注入等问题吧
    gam2046
        4
    gam2046  
       2022-06-25 03:31:02 +08:00
    复杂的数据库请求,手写 SQL 基本很难避免,各个语言的 ORM 对于简单的查询支持都没问题,比如单表查询,简单的多表查询,但是一旦复杂起来,ORM 生成的 SQL 通常只是能用,但执行效率很一般。

    另外就是一些关于数据库相关的特殊语法,ORM 支持程度也很有限。以我常用的 postgresql 为例,如果需要跨数据库查询,甚至需要使用 join 语句进行 update ,ORM 都无法完成,需要使用许多代码,先进行查询,数据送到应用程序内,再通过游标逐条判断进行 update 。而这些对于现代的数据库,基本上都提供了原生的支持。还是以我常用的 postgresql 为例,上面的需求只需要这样的一句 SQL 即可完成。

    with t as (
    select t1.identifier as tid,t2.created_at
    from table_devices t1 left join dblink('self','select identifier,created_at from table_devices')
    as t2(identifier text,created_at timestamp)
    on t1.identifier = t2.identifier
    )
    update table_devices
    set created_at = t.created_at
    from t
    where identifier=t.tid and t.created_at is not null

    就我个人而言,ORM 的主要用途是提供了数据库表到编程语言的类( golang 中的 struct )以及数据类型的对应关系。如果不是单表操作,我更倾向于手写 SQL 。

    至于 ORM 支持不同数据库之间的水平迁移,本身就是个伪需求,实际生产中,几乎不会出现底层数据库的切换。如果真的发生,本身就需要细致的测试。简单的 select/join 这种操作,原本就是所有关系型数据库都支持,并不需要 ORM 。而带有数据库特色的语法,多数 ORM 也根本就不支持,这些功能就是手写的。
    jam1024
        5
    jam1024  
    OP
       2022-06-25 10:06:16 +08:00
    @gam2046 ORM 其实可以理解为对数据库访问的辅助类,不管你怎么样,最终还是离不开自己构建一个方便的访问操作框架,所以一开始用别人现场的不好?功能不够的可以再加
    am1024
        6
    jam1024  
    OP
       2022-06-25 12:33:06 +08:00
    首先,要表面我的 2 个核心观点就是不推崇所谓的一上来就纯 sql 库给自己挖坑,然后第二个是不要过分妖魔化 ORM 。 所谓纯 sql 库比 ORM 更好本来就是伪命题,是自己给自己制造焦虑,制造痛点。软件工程的最后肯定都是为了更易用,更通用。正如为何要用 IDE ,直接记事本手撸不行吗,为何要用 GUI ,直接 command line 不行吗,底层对精细化的掌控的追求的确是好,但必有大的牺牲。这里把 ORM 想象为对数据库访问的辅助集合就能更容易理解,纯 sql 的调用,后期为了方便易用,最终肯定也会写个类似的辅助集合,活着活着,就活成了“别人的模样”。

    有人说 ORM 里你看不到 sql 的逻辑,ORM 里能打开控制台输出具体执行了哪些 sql 的功能吧。有人说 ORM 的性能不行,稳定性不行,难道说开发 ORM 的程序员都是傻 X ,故意弄一个很卡,很慢,很不稳定的库出来?即使有部分逻辑性能上有问题,但一般 ORM 的库都提供了易于扩展的方式,然后你可以修改为你认为的高性能的方式即可。然后是 ORM 一般也支持直接 raw sql 的方法或函数,如果原生的查询满足不了,还能直接执行 raw sql 。
    pastor
        7
    pastor  
       2022-06-27 14:43:15 +08:00
    我刚问过大司马,他说 OP 现在还在第一层,哈哈哈
    awanganddong
        8
    awanganddong  
       2022-07-12 17:55:49 +08:00
    以前看过这篇文章,觉得讲的蛮有道理,
    这个东西本来就是一个取舍。
    就看公司层面注重什么。


    为什么要旗帜鲜明地反对 orm 和 sql builder 。

    https://xargin.com/you-should-avoid-orm-and-sql-builder/
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2657 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 03:16 PVG 11:16 LAX 20:16 JFK 23:16
    Do have faith in what you're doing.
    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