The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
aababc

业务系统开发语言从 PHP / Python 转向 Go 如何实现数据的存储

  •  
  •   aababc · 14h 53m ago · 1306 views

    之前主要是使用 PHP/Python 做业务系统开发, 比较习惯 Doctrine, Eloquent, SQLAlchemy 这类 ORM 的模式

    Load Entity
        ↓
    修改对象属性
        ↓
    ORM 检测变更
        ↓
    只 UPDATE 发生变化的字段
    

    比如:

    $order = Order::find(1);
    $order->paid($time);
    $order->save();
    
    $order = $entityManager->find(Order::class, 1);
    $order->paid($time);
    $entityManager->flush();
    

    业务代码只需要表达业务数据变成了什么样, 至于那些字段有变化, 最终那些数据被保存到数据库中, 是由 ORM 的 dirty tracking/Unit of Work 负责.

    但是最近再写 Go 的时候, 感觉主流的方式更偏向于显式更新

    db.Update(ctx, id, map[string]any{
        "paid_at": "xxxx",
        "paid": 1,
    })
    

    或者

    db.Model(&order).Update(ctx, id, Order{
        PaidAt: "xxxx",
        Paid: 1,
    })
    

    简单的场景来说, 还比较清晰, 那么对一个比较复杂的场景来说, 变化的字段比较多的时候, 而且想实现类型安全的时候是不是不太容易.

    目前我使用的几种方案:

    1. 每次都全量更新, 不管更新了几个字段, 每次都全部刷新到数据库里
    2. 业务层面整理好需要更新的字段,通过 map[string]any 方式更新

    我想听听大家的意见, 跟大家学习学习

    15 replies    2026-08-30 12:03:57 +08:00
    maigebaoer
        1
    maigebaoer  
       14h 36m ago via Android
    golang 也有 gorm 这类 ORM ,只是文档之类的资料不完整,远不如 PHP 和 Python 的 ORM 好用。我这边是用官方 sql 包😅
    NotLongNil
        2
    NotLongNil  
       14h 14m ago
    go 没有那么重的 orm 库。无论哪种方案,你都必须自己处理好事务。你这第一种方案,不是不行,就是没人这么用
    zengxs
        3
    zengxs  
       13h 59m ago
    全量更新对数据库压力很大,并发稍高就得寄,除非你们并发是个位数
    liqinliqin
        4
    liqinliqin  
    PRO
       13h 58m ago
    bitmin
        5
    bitmin  
       13h 29m ago
    让 agent 写就得了,不用考虑写的麻烦代码量多这种问题,现在还有完全不用 AI 写代码的吗
    caola
        6
    caola  
       12h 45m ago
    user.LastIp = lastIp

    if err := db.Pgsql().Select("last_ip").Save(&user); err != nil {
    return response.HttpFail(c, "系统错误,请稍后重试")
    }

    Gorm 可以用 Select() 来指定更新其中某些字段
    mooyo
        7
    mooyo  
       7h 55m ago
    写裸 SQL 更好,反正都是 agent 写了,agent 写的 SQL 比你写得好
    mooyo
        8
    mooyo  
       7h 55m ago
    然后自己稍微封装一些常用的 CRUD SQL 层操作
    loading
        9
    loading  
       6h 6m ago via Android
    go ,数据库记得处理好零值,挺烦人的。
    singer
        10
    singer  
    PRO
       5h 20m ago
    https://gorm.io/zh_CN/

    golang 用这个简单一点
    kran
        11
    kran  
       4h 7m ago via iPhone
    https://github.com/kran/dba

    按照自己的经验封装了这个库,除了全量和 map ,还可以定义小结构体来做特定字段的更新
    SethShi
        12
    SethShi  
       2h 57m ago
    别纠结了, 用 gorm gen, 生成范式, 然后 AI 夸夸写
    yougg
        13
    yougg  
       2h 11m ago via Android
    让 AI 帮你写 raw SQL
    然后 sqlc 转 go 代码
    panlatent
        14
    panlatent  
       1h 45m ago via Android
    迁移的话,是不是可以先选一个类似的 orm ,然后再去 orm
    lmmlwen
        15
    lmmlwen  
       1h 20m ago
    这种 curd 不就是 AI 最擅长的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2814 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 05:24 · PVG 13:24 · LAX 22:24 · JFK 01:24
    ♥ Do have faith in what you're doing.