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

aababc 2026-08-29 22:30 1

之前主要是使用 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 方式更新


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

最新回复 (17)
  • maigebaoer 08-29 22:47
    1
    golang 也有 gorm 这类 ORM ,只是文档之类的资料不完整,远不如 PHP 和 Python 的 ORM 好用。我这边是用官方 sql 包😅
  • NotLongNil 08-29 23:09
    2
    go 没有那么重的 orm 库。无论哪种方案,你都必须自己处理好事务。你这第一种方案,不是不行,就是没人这么用
  • zengxs 08-29 23:24
    3
    全量更新对数据库压力很大,并发稍高就得寄,除非你们并发是个位数
  • liqinliqin 08-29 23:25
    4
    直接用 https://github.com/swoole/typephp 搞定,
  • bitmin 08-29 23:54
    5
    让 agent 写就得了,不用考虑写的麻烦代码量多这种问题,现在还有完全不用 AI 写代码的吗
  • caola 08-30 00:38
    6
    user.LastIp = lastIp

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

    Gorm 可以用 Select() 来指定更新其中某些字段
  • mooyo 08-30 05:28
    7
    写裸 SQL 更好,反正都是 agent 写了,agent 写的 SQL 比你写得好
  • mooyo 08-30 05:28
    8
    然后自己稍微封装一些常用的 CRUD SQL 层操作
  • loading 08-30 07:17
    9
    go ,数据库记得处理好零值,挺烦人的。
  • singer 08-30 08:03
    10
    https://gorm.io/zh_CN/

    golang 用这个简单一点
  • kran 08-30 09:16
    11
    https://github.com/kran/dba

    按照自己的经验封装了这个库,除了全量和 map ,还可以定义小结构体来做特定字段的更新
  • SethShi 08-30 10:26
    12
    别纠结了, 用 gorm gen, 生成范式, 然后 AI 夸夸写
  • yougg 08-30 11:12
    13
    让 AI 帮你写 raw SQL
    然后 sqlc 转 go 代码
  • panlatent 08-30 11:39
    14
    迁移的话,是不是可以先选一个类似的 orm ,然后再去 orm
  • lmmlwen 08-30 12:03
    15
    这种 curd 不就是 AI 最擅长的
  • aababc 楼主 08-30 17:35
    16
    @liqinliqin #4
    我们原来的技术栈都是 laravel/symfony 基于 FPM 优先的 PHP 技术栈, typephp 刚发布没多久稳定性啥的还没有经过验证, 而且和现有生态的融合咋样好像也说不清楚, 至少在我来看短时间不会选择! 感觉 trueasync 进入了 PHP 内核可能更有利好吧! 不过 swoole 团队的能力确实强, 能做这么多东西出来确实也是对 PHP 的利好!
  • liqinliqin 08-30 18:26
    17
    @aababc 没问题的,既然用过 swoole,就花 3 分钟试下 typephp
* 帖子来源V2EX
返回