Golang Go语言中项目对模型映射数据库表结构的解决方案是什么?
<br>由于本人是重度 django 玩儿家,习惯 django 的那种自动 migrations 、migrate ,模型-数据库的那种迁移方式。<br>现在转 go ,但是找了一下没发现,有什么好用的包可以将,struct 映射数据库(全自动),不需要手动编写 sql ,<br>支持表结构一步一步修改,删除、重命名等记录。<br>你们 gohper,在项目 struct->数据库当中都是怎么个管理方案。<br><br>
Golang Go语言中项目对模型映射数据库表结构的解决方案是什么?
GORM ?
更多关于Golang Go语言中项目对模型映射数据库表结构的解决方案是什么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
手动档
object->json ,现在没哪个数据库不支持的。
好像对表修改字段不太友好,没有深度使用
gorm 里的 automigrate 。缺点在于:改已有的类型属性、或者索引改不了,比如 varchar100 ,改成 200 ,识别不了。gorm 里也有 dry run 只导出 sql
参考现有的工具,自己魔改啦
我的技术栈是 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. 不与开发语言绑定。极端情况下,使用其他语言重构服务时会减少很多不必要的麻烦;
但是这些东西,在设计好的 ORM 里都有自动化工具做。敲两个命令就出来了,手动除了费事还容易出错。
entgo
和 Django 的 orm 比,不对,和其他任何语言的 orm 框架比,go 的 orm 框架就是一个弟弟
#10 首先哈,现代化的 IDE 可以帮助你写 SQL ,其次需要维护的 SQL 都是简单的 DDL sql ,并不复杂。最后哈,基本的 sql 能力是开发人员的必备项。
#9 纠正个小错误,是docs/sql
目录,而不是直接的docs/
目录。
老实维护 sql 版本变更吧,这玩意还是手写让人踏实。
GoFrame 统一管理
能自动化的东西,为何要手动维护?
https://github.com/yougg/awesome-go-orms
已主推项目从 GORM 全面切换到 sqlc 了,包含几百张表/分表查询/各种关联查询/视图/存储过程等等,上生产稳定运行运行 1 年多。
sqlc
#17 生产环境还是自己背锅比较好,因为有时因为 bug ,可能就丢了列甚至表。当然,用工具生成方案是对的,但依然要人工审查一次。
记得没有 gorm 对类行改动好像很有问题
我是自己根据 struct 的 tag 组成 sql 语法 从建立资料库 建立表栏位 更改表栏位语法都生成并运行
仓库里单独建个目录放好用来改变的 sql ,做好版本记录。
https://gorm.io/gen/
字节内部用的这个,gorm 加强版
可以连上数据库,生成 go 代码
个人感觉有个工具能对比测试库和线上库的差异比较重要。表结构个人喜欢以数据库表为核心,映射用工具生成或者手写无所谓,只要字段对的上。按这个思路的话自动迁移其实可以不用
同多年 Go 经验,完全同意你说的。
另外就是新项目我基本都会给大家安利 MongoDB 和 Cassandra 这些 NoSQL ,直接避开 migration 问题。只要不是需要 transaction 的交易服务那些,NoSQL 绝对更省心(除非团队里都是 SQL 老油条)
大部分项目,不管是技术栈熟悉程度还是事务的方面,类 MySQL 数据库都是避不开的。
通过我说的方式来记录表结构,还有一个优势就是我不需要去完全学会那些 orm 库的各种 tag 语法。我个人认为哈,这东西完全对开发人员是一个多余的学习成本,虽然并不复杂,但是你耐不住他语法足够多还在不断更新,完全不利好语言新人。
而且这玩意和语言绑定,我最讨厌和什么东西绑定了,我现在的一个微服务项目没有使用任何框架,就是 go 加上 grpc ,注册发现都是直接用的 k8s 的 service ,做到足够简洁,如果有开发新人,他不需要学习额外太多东西。
如果不用 orm, 可以试试我这个 github.com/lesismal/sqlw
Can’t agree more!
gorm gen
可以看看 gorm/gen or sqlc?
gorm gen +1
用 migrate 管理,但不自动执行。
用 sqlc 生成 db 模型和查询。根据需要可以手工映射一次,隔离 db 实现。
兄弟们 sql 上线没有 dba 审核的么?
map[string]any
我是基于这个魔改的
通过 sql 反向生成 go struct 映射数据库代码会更简单,连接数据库后,指定表来生成对应 gorm 的 struct 代码,https://go-sponge.com/ui/web-model
我用的是这个,挺好用的,每次需要哪个表就生成一下: https://github.com/xxjwxc/gormt 我的配置文件:
https://gist.github.com/haomiao33/9482a96c0ae8367a8a134ee0e9aab7a0
怎么那么多人提 gorm gen 印象中这个只是 ddl -> orm model ,但是做不了 sql migrations 变更吧。
反正本来就有开发环境、测试环境、预发布环境三个环境做测试,如果还能让 DDL 错误上线的话那还是毁灭吧。
另外,不用工具什么都自己手动做,那么在不用付出学习成本的同时也意味着什么事情都要自己花时间,并且不能享有开源项目发展带来的好处。我觉得这和现在的开发理念是背道而驰的。
gentool
在Golang(Go语言)项目中,将模型映射到数据库表结构通常采用的是ORM(Object-Relational Mapping)框架。ORM框架允许开发者以面向对象的方式来操作数据库,极大简化了数据库操作代码,提高了开发效率。以下是几种常见的Go语言ORM解决方案:
-
GORM: GORM是一个非常流行的Go ORM库,它提供了丰富的功能,如链式操作、自动迁移、预加载、事务支持等。GORM支持多种数据库,如MySQL、PostgreSQL、SQLite等,并且具有高度的可扩展性。
-
XORM: XORM是另一个功能强大的Go ORM库,它支持多种数据库,并提供了简单的API来进行数据库操作。XORM支持SQL生成、自动迁移、事务管理等功能,并且与GORM类似,也支持链式操作。
-
SQLBoiler: SQLBoiler是一个基于模板的ORM生成器,它根据数据库架构自动生成Go代码。这种方式的好处是生成的代码性能较高,但需要一定的配置和模板编写能力。
-
Goqu: 虽然Goqu本身不是一个完整的ORM框架,但它是一个强大的SQL构建器,可以方便地与Go结构体结合使用来实现模型与数据库表结构的映射。
在选择ORM框架时,建议根据项目需求、团队熟悉度以及数据库类型等因素进行综合考虑。GORM因其丰富的功能和良好的社区支持,通常是许多Go项目的首选。