go 项目中对模型映射数据库表结构的解决方案是什么?

4 天前
 longmeier90
```
由于本人是重度 django 玩儿家,习惯 django 的那种自动 migrations 、migrate ,模型-数据库的那种迁移方式。
现在转 go ,但是找了一下没发现,有什么好用的包可以将,struct 映射数据库(全自动),不需要手动编写 sql ,
支持表结构一步一步修改,删除、重命名等记录。
你们 gohper,在项目 struct->数据库当中都是怎么个管理方案。

```
1913 次点击
所在节点    Go 编程语言
42 条回复
ni9ht
4 天前
GORM ?
securityCoding
4 天前
手动档
Ayanokouji
4 天前
emartcn
4 天前
object->json ,现在没哪个数据库不支持的。
longmeier90
4 天前
@ni9ht 好像对表修改字段不太友好,没有深度使用
longmeier90
4 天前
手动挡太慢,容易出错。团队成员水平不一样,使用工具最方便
edisonwong
4 天前
gorm 里的 automigrate 。缺点在于:改已有的类型属性、或者索引改不了,比如 varchar100 ,改成 200 ,识别不了。gorm 里也有 dry run 只导出 sql
Desdemor
4 天前
参考现有的工具,自己魔改啦
lasuar
4 天前
我的技术栈是 go 微服务,多年经验。

以我个人经验哈,不要去依赖工具的 migration api ,这在做项目迁移/重构时是噩梦,并且对于日常的表维护不够透明。当我希望查一个表结构时,我需要去数据库才能查到,通过代码始终是不直观的,部分开发者为了图方便有时候会绕过代码直接修改表结构,这就使得代码中的映射成为摆设,长期以往,这其中的工程复杂度是难以想象的。!

我项目中对于表维护的开发流程:

1. 对于新表,在项目根目录建立 `docs/`目录,以业务为名称建立`.sql`文件,其中可以存放业务相关的一张或多张表的原始 CREATE sql 。这些文件将受到版本控制!

2. 对于旧表的更改, 例如增删字段,首先修改文件中的 CREATE sql ,其次建立`docs/log/`子目录,在子目录中新建`yyyymmdd.sql`(时间为上线日期),其中存放用于上线日改表的 ALTER sql 。

3. 上线时,上线人员(这个一般不会给脚本操作)手动执行 sql ,以及其他更新服务步骤。

这样的好处:

1. 通过`docs/`目录可以直观的看到系统中有多少业务(建了表),每个业务建表数量开发人员是基本清楚的,所以整体来说也是一目了然;
2. 在需要做整体的表结构优化时,通过`docs/`目录可以快速浏览现有表的结构特征,并制定优化方案;
3. 在需要迁移时,直接执行`docs`目录下的所有 sql 文件即可。
4. 对于做了按日期/ID 拆分的表,CREATE SQL 中的表名也要加上类型的 pattern ,以便识别:`create table xxx_$yyyymm ...`;
5. 利好开发新人;
6. 不与开发语言绑定。极端情况下,使用其他语言重构服务时会减少很多不必要的麻烦;
liuhan907
4 天前
@lasuar
但是这些东西,在设计好的 ORM 里都有自动化工具做。敲两个命令就出来了,手动除了费事还容易出错。
helone
4 天前
entgo
Jinnrry
4 天前
和 Django 的 orm 比,不对,和其他任何语言的 orm 框架比,go 的 orm 框架就是一个弟弟
lasuar
4 天前
@liuhan907 #10 首先哈,现代化的 IDE 可以帮助你写 SQL ,其次需要维护的 SQL 都是简单的 DDL sql ,并不复杂。最后哈,基本的 sql 能力是开发人员的必备项。
lasuar
4 天前
@lasuar #9 纠正个小错误,是`docs/sql`目录,而不是直接的`docs/`目录。
ninjashixuan
4 天前
老实维护 sql 版本变更吧,这玩意还是手写让人踏实。
mogging
4 天前
GoFrame 统一管理
liuhan907
4 天前
@lasuar 能自动化的东西,为何要手动维护?
fffq
4 天前
yougg
4 天前
https://github.com/yougg/awesome-go-orms

已主推项目从 GORM 全面切换到 sqlc 了,包含几百张表/分表查询/各种关联查询/视图/存储过程等等,上生产稳定运行运行 1 年多。
henix
4 天前
sqlc

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1085373

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX