V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
KevinBlandy
V2EX  ›  Go 编程语言

Go 感觉没有一个趁手的 ORM 框架啊?

  •  
  •   KevinBlandy · 2021-12-05 19:23:22 +08:00 · 11135 次点击
    这是一个创建于 1119 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我本来是搞 Java 的。一直用 QueryDslJooq 这种 DSL 风格的 ORM ,感觉老棒了。

    但是 Go 好像没,grom/xorm 都 jio 得难用。

    41 条回复    2022-04-28 00:40:38 +08:00
    40EaE5uJO3Xt1VVa
        1
    40EaE5uJO3Xt1VVa  
       2021-12-05 19:31:28 +08:00
    自己写一个 。我也觉得 GROM 老不爽了。
    freakxx
        2
    freakxx  
       2021-12-05 19:39:14 +08:00   ❤️ 3
    INCerry
        3
    INCerry  
       2021-12-05 19:42:56 +08:00
    go 不是银弹 写比上层代码还是换个语言吧
    hingbong
        4
    hingbong  
       2021-12-05 19:43:42 +08:00
    https://github.com/go-gorm/gen
    这个能靠近一点 jooq 吧
    wellsc
        5
    wellsc  
       2021-12-05 20:00:15 +08:00
    小而丑实现优雅的 orm 不太容易
    wweir
        6
    wweir  
       2021-12-05 20:02:33 +08:00
    用的 didi 的 query 生成器。简单 SQL 生成得很爽,复杂 SQL 手动来更方便
    to2false
        7
    to2false  
       2021-12-05 20:04:46 +08:00
    gorm+gen 、ent 感觉都不错
    to2false
        8
    to2false  
       2021-12-05 20:05:03 +08:00
    @to2false #7 当然跟其他语言的 ORM 比那还是差点意思
    yl20181003
        9
    yl20181003  
       2021-12-05 21:38:30 +08:00
    ent 不错
    FightPig
        10
    FightPig  
       2021-12-05 21:46:41 +08:00   ❤️ 2
    一直写 rails 的人,被 ar 惯坏了,觉得哪个都不方便
    w3cll
        11
    w3cll  
       2021-12-05 22:09:10 +08:00
    laravel 吧
    Hanggi
        12
    Hanggi  
       2021-12-05 23:08:34 +08:00   ❤️ 1
    其实都挺好用的,主要还是先入为主。
    Buges
        13
    Buges  
       2021-12-05 23:22:35 +08:00 via Android   ❤️ 3
    语言的问题。没有好用的语言,不可能写出好用的库。
    chengxiao
        14
    chengxiao  
       2021-12-06 09:23:42 +08:00
    之前都在说没有泛型,ORM 是这样难用的 blabla
    现在有泛型了,看看哪个会变好用
    waising
        15
    waising  
       2021-12-06 09:34:01 +08:00
    ent 应该还可以 不过我用的 squirrel + sqlx 也没啥问题
    masterclock
        16
    masterclock  
       2021-12-06 09:40:03 +08:00
    ent 基于代码生成
    ent 用着麻烦的地方配合 goqu
    qW7bo2FbzbC0
        17
    qW7bo2FbzbC0  
       2021-12-06 09:41:21 +08:00
    sqlx 不错,我比较喜欢写 sql ,而不是生成
    moliliang
        18
    moliliang  
       2021-12-06 10:30:51 +08:00
    用生成器还是可以的,orm 并不好用~~
    lqs
        19
    lqs  
       2021-12-06 11:35:38 +08:00   ❤️ 1
    再次推销一下 sqlingo https://github.com/lqs/sqlingo

    mestrace
        20
    mestrace  
       2021-12-06 11:37:41 +08:00
    约定大于配置。之前团队使用代码生成,写好 SQL DDL 之后可以一键生成常用的 gorm 方法。
    openp2p
        21
    openp2p  
       2021-12-06 11:37:49 +08:00
    以前写了很多年 C++,突然有个写.net 的同事问,公司的里的 C++项目没用 orm 的?觉得有点不可思议。后来写 golang 去了,也遇到有人问同样的问题。于是尝试了几个 golang orm ,发现还是手动挡 sql 舒服。所以,存在即合理,总有人喜欢手动挡,有人喜欢自动挡。买菜喜欢自动,赛车喜欢手动
    cloverzrg2
        22
    cloverzrg2  
       2021-12-06 11:43:58 +08:00
    @hjahgdthab750 #17 容易一不小心就被注入,每次写 prepare 也麻烦
    HanMeiM
        23
    HanMeiM  
       2021-12-06 11:48:05 +08:00
    ent 和 jooq 其实挺像的。
    qW7bo2FbzbC0
        24
    qW7bo2FbzbC0  
       2021-12-06 11:50:07 +08:00
    @cloverzrg2 #22 我是 fmt.Sprintf()生成最终语句,不 prepare ,至于注入,如果是面向外部用户的话,的确要注意
    momowei
        25
    momowei  
       2021-12-06 11:53:35 +08:00
    gorm 也还好,怎么这么多吐槽的
    keepeye
        26
    keepeye  
       2021-12-06 11:58:25 +08:00
    go 既不可能变成动态语言,也不可能变成另一个 java ,取舍一下吧
    Hanggi
        27
    Hanggi  
       2021-12-06 12:18:12 +08:00   ❤️ 1
    总有一些喜欢用记事本写代码的人喊用 IDE 的人都是菜鸟,代码就得纯手写才舒服。
    整的好像用 ORM 的人都看不懂也不会写 SQL 似的。
    项目上点 Star 的那几万人也不可能都傻,肯定是满足了自身需求才用的,觉得不好用就换一个就好了。
    gowk
        28
    gowk  
       2021-12-06 12:49:38 +08:00   ❤️ 5
    一直写 .net 的人,被 ef/dapper 惯坏了,觉得哪个都不方便
    zjsxwc
        29
    zjsxwc  
       2021-12-06 12:59:24 +08:00
    gorm 总比手动 sql 好吧
    Linvas
        30
    Linvas  
       2021-12-06 14:04:54 +08:00
    duanquanyong
        31
    duanquanyong  
       2021-12-06 17:05:45 +08:00
    强裂推荐 sqlc ( https://github.com/kyleconroy/sqlc

    支持各种 migration 工具格式文件,手写 sql quer 文件,生成 go 代码和 Repostiory 接口
    waltcow
        32
    waltcow  
       2021-12-06 17:17:38 +08:00   ❤️ 1
    matrix1010
        33
    matrix1010  
       2021-12-06 17:22:00 +08:00
    对于天天写 CRUD 的兄弟们我只推荐 Ent ,真正的生产力工具。现在 v0.9.1 Custom Template 可扩展的地方更多了,定制化需求也能够满足。个人观点 Go web 开发只有配合代码生成才具有生产力。另外对于写 CRUD 还写测试的兄弟们可以试试我的 factory 轮子: https://github.com/Yiling-J/carrier, 类 factory_bot/boy 自动生成测试数据
    weichengwu
        34
    weichengwu  
       2021-12-06 17:31:39 +08:00
    @lqs #19 我孤陋寡闻了,第一次见到点号写在行末的风格,感觉好奇怪
    branchWater
        35
    branchWater  
       2021-12-06 17:40:44 +08:00
    @weichengwu java 不也是这种风格吗?函数太长了也得换行
    Hanggi
        36
    Hanggi  
       2021-12-06 17:43:20 +08:00 via iPhone
    @branchWater
    他的意思是别的语言都是
    db.query()
    .find()

    但是 go 语言是
    db.query().
    find()

    对吧
    @weichengwu
    branchWater
        37
    branchWater  
       2021-12-06 17:52:20 +08:00
    @Hanggi java 的点号放到行首和行末也都行啊,奇怪的在什么地方
    cmdOptionKana
        38
    cmdOptionKana  
       2021-12-06 18:07:55 +08:00
    ent 还不好用?
    sciel
        40
    sciel  
       2021-12-09 13:33:42 +08:00
    用 goframe 吧

    ```
    func (m *roleMenu) List(page int, size int, id string, rid string, mid string) (int, gdb.List) {
    db := g.DB().Model(dao.RoleMenu.Table + " t1").
    LeftJoin(dao.Role.Table + " t2 on t1.rid = t2.id").
    LeftJoin(dao.Menu.Table + " t3 on t1.mid = t3.id")
    if id != "" {
    db = db.Where("t1.id", id)
    }
    if rid != "" {
    db = db.Where("t1.rid", rid)
    }
    if mid != "" {
    db = db.Where("t1.mid", mid)
    }
    count, _ := db.Count()
    db.Fields("t2.name r_name,t3.name m_name,t1.id id")
    all, _ := db.Limit(size).Offset((page - 1) * size).Order("t1.id desc").All()
    if all.IsEmpty() {
    return count, gdb.List{}
    }
    return count, all.List()
    }
    ```
    yiplee
        41
    yiplee  
       2022-04-28 00:40:38 +08:00
    @duanquanyong #31 sqlc 的确不错,但是只适合固定的 sql ,遇到需要 dynamic query 的场景就蛋疼了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1102 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 18:45 · PVG 02:45 · LAX 10:45 · JFK 13:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.