GORM v2 正式发布! 20k stars ;) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
jinzhu

GORM v2 正式发布! 20k stars ;)

  •  
  •   jinzhu Aug 31, 2020 14325 views
    This topic created in 2068 days ago, the information mentioned may be changed or developed.

    GORM 2.0 从零开始重写,根据过去几年的用户反馈吐槽,做了大量的改进,历经半年终于达成 ;)

    主要更新

    • 性能改进
    • 代码模块化
    • Context,批量插入,预编译模式,DryRun 模式,Join 预加载,Find To Map,Create From Map,FindInBatches
    • 支持嵌套事务,SavePoint,Rollback To SavePoint
    • SQL 生成器,命名参数,分组条件,Upsert,锁, 支持 Optimizer/Index/Comment Hint,子查询改进,使用 SQL 表达式、Context Valuer 进行 CRUD
    • 支持完整的自引用,改进 Join Table,批量数据的关联模式
    • 允许多个字段用于追踪 create 、update 时间 ,支持 UNIX (毫 /纳)秒
    • 支持字段权限:只读、只写、只创建、只更新、忽略
    • 新的插件系统,为多个数据库提供了官方插件,读写分离,prometheus 集成...
    • 全新的 Hook API:带插件的统一接口
    • 全新的 Migrator:允许为关系创建数据库外键,更智能的 AutoMigrate,支持约束、检查器,增强索引支持
    • 全新的 Logger:支持 context 、改进可扩展性
    • 统一命名策略:表名、字段名、连接表名、外键、检查器、索引名称规则
    • 更好的自定义类型支持(例如:JSON )

    详情请参考 Release Note

    https://gorm.io/zh_CN/docs/v2_release_note.html

    100 replies    2020-12-28 10:19:38 +08:00
    SteinsGate
        1
    SteinsGate  
       Aug 31, 2020 via Android   1
    好喔
    snxq1995
        2
    snxq1995  
       Aug 31, 2020 via Android
    lrh3321
        3
    lrh3321  
       Aug 31, 2020 via Android
    update 的时候,忽略 limit 和 order by 的问题还存在吗?
    gigantic222
        4
    gigantic222  
       Aug 31, 2020
    kemikemian
        5
    kemikemian  
       Aug 31, 2020
    赞赞赞!!!
    kemikemian
        6
    kemikemian  
       Aug 31, 2020
    终于加入了批量新增
    paullee
        7
    paullee  
       Aug 31, 2020   2
    诸位大佬,小弟有一问求教,查询记录不存在时,大佬们都是在哪一层处理它呀?

    小弟现在是在业务层使用 gorm.isRecordNotFound()对 gorm 查询返回的错误判断一记,之前也尝试过在查询方法中返回(*data, *error),将记录未找到的错误场景处理为返回(nil, nil)。两种都感觉怪怪的。
    momowei
        8
    momowei  
       Aug 31, 2020
    牛,项目正好用 1 刚开始,切换到 2 看看
    wsseo
        9
    wsseo  
       Aug 31, 2020
    在线等 3.0
    Yoock
        10
    Yoock  
       Aug 31, 2020 via iPhone
    一会试试
    waising
        11
    waising  
       Aug 31, 2020
    支持一波
    cloudzhou
        12
    cloudzhou  
       Aug 31, 2020
    我对 gorm 最大的体验是,作者应该有很强的函数化编程背景,所以很重度使用函数化,各种 hook
    而我对于中间件类型代码,是很反对函数化
    我对中间件类型代码的要求,就是 Go 本身源代码,我一眼看下去就知道在做什么
    aladdindingding
        13
    aladdindingding  
       Aug 31, 2020
    顶!
    zhaoxj58
        14
    zhaoxj58  
       Aug 31, 2020 via iPhone
    赞楼主
    FEDT
        15
    FEDT  
       Aug 31, 2020
    赞一个~
    securityCoding
        16
    securityCoding  
       Aug 31, 2020
    @cloudzhou jinzhu 什么背景啊,很强...
    dany813
        17
    dany813  
       Aug 31, 2020
    厉害
    Hanggi
        18
    Hanggi  
       Aug 31, 2020
    已经在用了
    guanhui07
        19
    guanhui07  
       Aug 31, 2020
    赞赞赞!!!
    pkoukk
        20
    pkoukk  
       Aug 31, 2020
    用 v1 的项目写到一半,周一来一看更新到 v2 了,我是迁移还是不迁移呢
    ghjacky
        21
    ghjacky  
       Aug 31, 2020
    一直在用 gorm,赞!!!
    ylsc633
        22
    ylsc633  
       Aug 31, 2020
    不知道多对多查询 那个问题还存在不
    不过 还是赞一个
    jamry
        23
    jamry  
       Aug 31, 2020
    顶一个
    还在等大牛推出稳定的 oracle dialector
    Hancock
        24
    Hancock  
       Aug 31, 2020
    批量终于来了
    qxqsxbd
        25
    qxqsxbd  
       Aug 31, 2020
    刚上线个项目用了 v1
    labulaka521
        26
    labulaka521  
       Aug 31, 2020
    blless
        27
    blless  
       Aug 31, 2020 via Android
    delete 的时候没有参数还会把整张表删掉吗?当年因为这个事一直不敢用 gorm
    blless
        28
    blless  
       Aug 31, 2020 via Android
    应该说删除的时候,因为默认结构体没有赋值,所以一不小心就把整表删了
    Kr98
        29
    Kr98  
       Aug 31, 2020 via Android
    @blless update 也有这种问题,我一开始的理解是这种情况应该返回错误,结果 gorm 直接对整张表进行操作
    looplj
        30
    looplj  
       Aug 31, 2020
    很喜欢 gorm 的设计,完全的插件化,定制化太强了额。对我自己项目的设计也有很大的启发。
    blless
        31
    blless  
       Aug 31, 2020 via Android
    @Kr98 所以当时发现这个情况,就不敢在线上用,然后换了 xorm
    zackkson1991
        32
    zackkson1991  
       Aug 31, 2020
    赞!
    imherer
        33
    imherer  
       Aug 31, 2020
    @paullee 我一般的是在 model 层处理

    我一般的做法是:例如用 UID 查询,当记录不存在的时候返回 nil,同时 user.UID = 0,上一次判断 user.UID 是否等于 0 来判断记录存不存在

    不过感觉好像也不是很好
    dcalsky
        34
    dcalsky  
       Aug 31, 2020
    Preload("articles")以前如果是空会返回空数组,现在直接变 null 了。感觉有问题
    justin2018
        35
    justin2018  
       Aug 31, 2020
    ![yUBe256]( )

    还有英文介绍~
    kosgug
        36
    kosgug  
       Aug 31, 2020 via iPhone   1
    居然作者直接来推,现在一直用 entgo,有没有对比过
    owenliang
        37
    owenliang  
       Aug 31, 2020
    支持,一直在用。
    blackeeper
        38
    blackeeper  
       Aug 31, 2020
    一直在用,作者牛皮!
    yiplee
        39
    yiplee  
       Aug 31, 2020
    升级之后手动创建 index 的方法 db.AddIndex 和 db.AddUniqueIndex 找不到了
    back0893
        40
    back0893  
       Aug 31, 2020
    @pkoukk 一样,纠结.中
    hduwillsky
        41
    hduwillsky  
       Aug 31, 2020
    Jinzhu 大佬 NB
    jinzhu
        42
    jinzhu  
    OP
       Aug 31, 2020   1
    @lrh3321 已经修复了,需要使用最新的 mysql driver,不过这种特性只有 mysql 支持,其它数据库都不可以
    jinzhu
        43
    jinzhu  
    OP
       Aug 31, 2020
    @paullee 用的 Find ?没找到数据不返回错误,判断下 RowsAffected
    jinzhu
        44
    jinzhu  
    OP
       Aug 31, 2020
    @cloudzhou 函数化为了提供一些扩展可能性,在一些场景下还是挺需要的,不过排斥这个的话也没有关系,甚至可以用 GORM 的 raw sql 模式,他对 named argument 之类的支持应该也比其它的 sql builder 好一些,并且也不重
    jinzhu
        45
    jinzhu  
    OP
       Aug 31, 2020
    @pkoukk 肯定迁移呀,V2 和 V1 比改善巨大 ;)
    jinzhu
        46
    jinzhu  
    OP
       Aug 31, 2020
    @blless V1 有个 BlockGlobalUpdate 模式,可以启用这个模式就不会了,V2 现在是默认选项了,默认不会删除 /更新全表
    jinzhu
        47
    jinzhu  
    OP
       Aug 31, 2020
    @ylsc633 不知道你说的啥问题。。。对于关联的代码全部重写了,新的逻辑比之前的代码对边缘情况处理好很多
    jinzhu
        48
    jinzhu  
    OP
       Aug 31, 2020
    @jamry 有个小伙伴在写这个了,貌似进展还不错
    jinzhu
        49
    jinzhu  
    OP
       Aug 31, 2020   1
    @Kr98 V1 有个 BlockGlobalUpdate 模式,可以启用这个模式就不会了,V2 现在是默认选项了,默认不会删除 /更新全表
    jinzhu
        50
    jinzhu  
    OP
       Aug 31, 2020
    @dcalsky 现在直接变 null 了是什么意思? Articles 是一个 slice 的指针?
    jinzhu
        51
    jinzhu  
    OP
       Aug 31, 2020   1
    @yiplee 现在 migrator 更强大了, 参考 https://gorm.io/docs/migration.html
    dobelee
        52
    dobelee  
       Aug 31, 2020 via iPhone
    每天都在代码里看到大佬的 ID 。膜拜一下。
    tomtiddler
        53
    tomtiddler  
       Aug 31, 2020
    看了下文档,不创建外键的情况下还是无法使用关联是吗。。。
    tomtiddler
        54
    tomtiddler  
       Aug 31, 2020
    哦,支持不创建外键了。。。看到了,藏得有点深。
    zibber
        55
    zibber  
       Aug 31, 2020
    各位,分表有什么最佳实践
    jinzhu
        56
    jinzhu  
    OP
       Aug 31, 2020
    @zibber 使用 Scopes 这个方法来分表,其它读写分离之类的可以参考 https://gorm.io/docs/dbresolver.html
    lekai63
        57
    lekai63  
       Aug 31, 2020 via iPhone
    v2 版本 beta 的时候就开始用啦 :)
    yrj
        58
    yrj  
       Aug 31, 2020 via iPad
    支持链式设置表别名了嘛,我记得 v1 是不行的
    fy
        59
    fy  
       Sep 1, 2020
    近距离接触大佬,支持一下
    mscb
        60
    mscb  
       Sep 1, 2020 via Android
    请问一下,就是 gorm 里面的 offset 和 limit 它们要求传入的是 int 型。可是表行数有可能会超过 int 的范围,按理说应该得接受传入 int64 比较合理。请问这边这样设计是有啥原因吗?
    lrh3321
        61
    lrh3321  
       Sep 1, 2020 via Android
    @mscb #60 这么大的 offset 和 limit,你不考虑先分库分表或者优化别的地方吗
    qs2d
        62
    qs2d  
       Sep 1, 2020
    一直在用,果断升级
    chengxiao
        63
    chengxiao  
       Sep 1, 2020
    支持下,不过什么时候 Oracle 能被支持呢?最近被 Oracle 折腾的死去活来的
    mscb
        64
    mscb  
       Sep 1, 2020 via Android
    @lrh3321 我知道过大的 offset 会有性能问题,但是这不应该是我考虑的事情嘛?底层通用框架的话不应该管的这么宽啊~期待作者回复
    jinzhu
        65
    jinzhu  
    OP
       Sep 1, 2020
    @mscb int 在 64 位机器上和 int64 一样的(现在应该都是 64 位机器了吧?)
    jinzhu
        66
    jinzhu  
    OP
       Sep 1, 2020
    @chengxiao 有个相关 PR https://github.com/go-gorm/gorm/pull/3338 , 可以帮测试下看看
    andyangyu
        67
    andyangyu  
       Sep 1, 2020
    有没有升级需要注意的事项呢?
    wangdk23411
        68
    wangdk23411  
       Sep 1, 2020
    赞,赶紧测试
    skadi
        70
    skadi  
       Sep 1, 2020
    终于 v2 了么? 隐藏坑点有讲明么?
    mscb
        71
    mscb  
       Sep 1, 2020 via Android
    @jinzhu 这样的话,确实也是~
    hijoker
        72
    hijoker  
       Sep 1, 2020
    批量插入终于支持了么
    tozp
        73
    tozp  
       Sep 1, 2020
    可以用在生产环境了嘛?
    ooh
        74
    ooh  
       Sep 1, 2020
    所以可以获取 SQL 查询语句了?
    JeromeCui
        75
    JeromeCui  
       Sep 1, 2020
    牛逼牛逼
    barbery
        76
    barbery  
       Sep 1, 2020
    不错不错,go 的项目一直用这个库
    jinzhu
        77
    jinzhu  
    OP
       Sep 1, 2020
    @ooh https://gorm.io/docs/session.html#DryRun 可以通过这个模式获取
    @hijoker en
    @tozp 现在已经有几百个线上服务在踩雷了 ;)
    vZexc0m
        78
    vZexc0m  
       Sep 1, 2020
    感觉自动迁移有问题,不知道是不是 tag 没有设置好。

    一是会多次对同一字段多次创建索引(mobile),二是会不断迁移未更改的字段。
    windghoul
        79
    windghoul  
       Sep 1, 2020
    好哦~
    ooh
        80
    ooh  
       Sep 1, 2020
    @jinzhu 牛皮牛皮,之前一直纠结这个
    jinzhu
        81
    jinzhu  
    OP
       Sep 1, 2020
    @vZexc0m 确实可以复现 modify column 这个,已经修复,感谢!
    tairan2006
        82
    tairan2006  
       Sep 2, 2020 via Android
    我其实一直有个疑问,楼主为啥 id 叫金主(
    rammiah
        83
    rammiah  
       Sep 2, 2020 via Android
    @lrh3321 今天就遇见这个问题了更新一下 gorm.io/driver 就行了
    petelin
        84
    petelin  
       Sep 2, 2020 via iPhone
    是我在各个语言里遇到的最难用的 orm 。
    而且因为 start 太多 导致其他人不愿意去写一个类似的库。毕竟这个东西更大消耗是在维护上。

    我怀疑作者根本没看过其他 orm 的实现,或者一开始没有投入什么精力,一厢情愿的提供了零碎的东西,写着玩玩,可以称之为玩具。敢用在生产环境也的人也是疯了。

    只针对 gorm1,gorm2 还没看。
    jinzhu
        85
    jinzhu  
    OP
       Sep 2, 2020
    @petelin Go 的 ORM 还真不少

    > 我怀疑作者根本没看过其他 orm 的实现,或者一开始没有投入什么精力,一厢情愿的提供了零碎的东西,写着玩玩,可以称之为玩具。敢用在生产环境也的人也是疯了。

    现在可以直接喷,不列证据了么?
    wnanbei
        86
    wnanbei  
       Sep 2, 2020
    @jinzhu 哈哈,消消气,有些人是这样的
    j2gg0s
        87
    j2gg0s  
       Sep 2, 2020
    @pkoukk 迁移把,用新不用旧。流量不是特别大的,应该也踩不到什么极端的坑
    LudwigWS
        88
    LudwigWS  
       Sep 2, 2020
    大佬我插个题外话。

    你现在都转用 Jetbrains 的产品呢了么。这几年 Emacs 和 Vim dot file 都没怎么更新。以前看到你说从 Vim 转 Emacs 了,现在是不是又回去 Vim 了。纯属好奇。
    jinzhu
        89
    jinzhu  
    OP
       Sep 2, 2020
    @LudwigWS 现在 tmux + vim 用的挺爽的。。。之前 emacs 试了一段时间,可能单进程的原因导致经常卡,就回到 vim 了,现在个人配置文件放私有仓库了... 所以没更新。。。
    blakejia"
        90
    blakejia  
       Sep 2, 2020
    最新版本啥时候发布呢?遇到了这个问题。看到是已经解决了。但是没发

    Gorm writes wrong SQL when trying to alter existing column for PostgreSQL

    https://github.com/go-gorm/gorm/issues/3339
    KickAssTonight
        91
    KickAssTonight  
       Sep 2, 2020
    支持,可以在查询前 WithContext 了!
    pkoukk
        92
    pkoukk  
       Sep 2, 2020
    @petelin go 没有泛型,你说说咋实现你所说的其它语言 orm 的功能?...
    jinzhu
        93
    jinzhu  
    OP
       Sep 2, 2020
    @blakejia 等再多收集几天的问题一起发个版吧
    blakejia
        94
    blakejia  
       Sep 3, 2020
    @jinzhu #93 对了。好像对 big.Int 或者 big.Float 目前还不支持么?测试了下。读取的时候报
    unsupported Scan, storing driver.Value type string into type *big.Int
    ysongyang
        95
    ysongyang  
       Sep 3, 2020
    自定义预加载报错:invalid query condition,是我用法不对吗? t/703904#reply0
    ccxx
        96
    ccxx  
       Sep 6, 2020 via iPhone
    @jinzhu 请问查询单个字段怎么 scan 到变量而不是结构体,文档的例子 scan 到 int 类型的变量可以,但是数据库查询 varchar 的字段 scan 到 steing 类型的变量不行。
    Aoang
        97
    Aoang  
       Sep 26, 2020 via Android
    @jinzhu 现在 Gorm 是不是不需要手动关闭连接了。
    V1 有 db.Close(),V2 好像得 db.DB() 拿到 sql.DB 之后进行关闭。

    关闭这个步骤在 V2 里面不再是必须的了?
    jinzhu
        98
    jinzhu  
    OP
       Sep 27, 2020
    @ccxx 最新版本应该可以了

    @Aoang 其实对于大多数应用 v1 版本也不需要 Close,用连接池就好了,好多人用错,于是直接把 Close 方法去掉了,刚需 Close 的人应该也能从文档里找到怎么用
    wuqingdzx
        99
    wuqingdzx  
       Nov 19, 2020
    1.20.6 还没有 CreateInBatches 这个方法
    kennry
        100
    kennry  
       Dec 28, 2020
    @jinzhu
    问题一:v2 版本添加索引值只能在对象的 tag 添加吗,手动进行迁移时不能和 v1 一样单独添加吗,这样添加多个索引时对象 tag 会很长,而且 gorm.Model 软删除的字段也添加不进联合索引
    问题二:自动迁移时添加外键关联会把外键的相关结构体的外键字段数据库生成时会自动生成为 bigint 类型,而不是我关联结构体定义的类型,这个怎么破?
    About     Help     Advertise     Blog     API     FAQ     Solana     5245 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 288ms UTC 06:02 PVG 14:02 LAX 23:02 JFK 02:02
    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