业务系统开发语言从 PHP / Python 转向 Go 如何实现数据的存储
之前主要是使用 PHP/Python 做业务系统开发, 比较习惯 Doctrine, Eloquent, SQLAlchemy 这类 ORM 的模式
```text
Load Entity
↓
修改对象属性
↓
ORM 检测变更
↓
只 UPDATE 发生变化的字段
```
比如:
```PHP
$order = Order::find(1);
$order->paid($time);
$order->save();
```
```php
$order = $entityManager->find(Order::class, 1);
$order->paid($time);
$entityManager->flush();
```
业务代码只需要表达业务数据变成了什么样, 至于那些字段有变化, 最终那些数据被保存到数据库中, 是由 ORM 的 dirty tracking/Unit of Work 负责。
但是最近再写 Go 的时候, 感觉主流的方式更偏向于显式更新。
```go
db.Update(ctx, id, map[string]any{
"paid_at": "xxxx",
"paid": 1,
})
```
或者
```go
db.Model(&order).Update(ctx, id, Order{
PaidAt: "xxxx",
Paid: 1,
})
```
简单的场景来说, 还比较清晰, 那么对一个比较复杂的场景来说, 变化的字段比较多的时候, 而且想实现类型安全的时候是不是不太容易。
目前我使用的几种方案:
1. 每次都全量更新, 不管更新了几个字段, 每次都全部刷新到数据库里
2. 业务层面整理好需要更新的字段, 通过 `map[string]any` 方式更新
我想听听大家的意见, 跟大家学习学习。
---
原文链接:[点击查看](https://www.v2ex.com/t/1238085)
```text
Load Entity
↓
修改对象属性
↓
ORM 检测变更
↓
只 UPDATE 发生变化的字段
```
比如:
```PHP
$order = Order::find(1);
$order->paid($time);
$order->save();
```
```php
$order = $entityManager->find(Order::class, 1);
$order->paid($time);
$entityManager->flush();
```
业务代码只需要表达业务数据变成了什么样, 至于那些字段有变化, 最终那些数据被保存到数据库中, 是由 ORM 的 dirty tracking/Unit of Work 负责。
但是最近再写 Go 的时候, 感觉主流的方式更偏向于显式更新。
```go
db.Update(ctx, id, map[string]any{
"paid_at": "xxxx",
"paid": 1,
})
```
或者
```go
db.Model(&order).Update(ctx, id, Order{
PaidAt: "xxxx",
Paid: 1,
})
```
简单的场景来说, 还比较清晰, 那么对一个比较复杂的场景来说, 变化的字段比较多的时候, 而且想实现类型安全的时候是不是不太容易。
目前我使用的几种方案:
1. 每次都全量更新, 不管更新了几个字段, 每次都全部刷新到数据库里
2. 业务层面整理好需要更新的字段, 通过 `map[string]any` 方式更新
我想听听大家的意见, 跟大家学习学习。
---
原文链接:[点击查看](https://www.v2ex.com/t/1238085)
· 0 个赞