GoForum🌐 V2EX

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

aababc · 2026-08-29 22:33 · 0 次点赞 · 5 条回复

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

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

5 条回复
maigebaoer · 2026-08-29 22:53
#1

golang 也有 gorm 这类 ORM ,只是文档之类的资料不完整,远不如 PHP 和 Python 的 ORM 好用。我这边是用官方 sql 包😅

NotLongNil · 2026-08-29 23:13
#2

go 没有那么重的 orm 库。无论哪种方案,你都必须自己处理好事务。你这第一种方案,不是不行,就是没人这么用

zengxs · 2026-08-29 23:28
#3

全量更新对数据库压力很大,并发稍高就得寄,除非你们并发是个位数

liqinliqin · 2026-08-29 23:28
#4
bitmin · 2026-08-29 23:58
#5

让 agent 写就得了,不用考虑写的麻烦代码量多这种问题,现在还有完全不用 AI 写代码的吗

添加回复
你还需要 登录 后发表回复

登录后可发帖和回复

登录 注册
主题信息
作者: aababc
发布: 2026-08-29
点赞: 0
回复: 0