V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
longmeier90
V2EX  ›  Go 编程语言

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

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

    ```
    42 条回复    2024-11-03 00:35:05 +08:00
    ni9ht
        1
    ni9ht  
       56 天前
    GORM ?
    securityCoding
        2
    securityCoding  
       56 天前 via Android   ❤️ 1
    手动档
    Ayanokouji
        3
    Ayanokouji  
       56 天前
    emartcn
        4
    emartcn  
       56 天前
    object->json ,现在没哪个数据库不支持的。
    longmeier90
        5
    longmeier90  
    OP
       56 天前
    @ni9ht 好像对表修改字段不太友好,没有深度使用
    longmeier90
        6
    longmeier90  
    OP
       56 天前
    手动挡太慢,容易出错。团队成员水平不一样,使用工具最方便
    edisonwong
        7
    edisonwong  
       56 天前
    gorm 里的 automigrate 。缺点在于:改已有的类型属性、或者索引改不了,比如 varchar100 ,改成 200 ,识别不了。gorm 里也有 dry run 只导出 sql
    Desdemor
        8
    Desdemor  
       56 天前
    参考现有的工具,自己魔改啦
    lasuar
        9
    lasuar  
       56 天前   ❤️ 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
        10
    liuhan907  
       56 天前
    @lasuar
    但是这些东西,在设计好的 ORM 里都有自动化工具做。敲两个命令就出来了,手动除了费事还容易出错。
    helone
        11
    helone  
       56 天前
    entgo
    Jinnrry
        12
    Jinnrry  
       56 天前 via iPhone
    和 Django 的 orm 比,不对,和其他任何语言的 orm 框架比,go 的 orm 框架就是一个弟弟
    lasuar
        13
    lasuar  
       56 天前
    @liuhan907 #10 首先哈,现代化的 IDE 可以帮助你写 SQL ,其次需要维护的 SQL 都是简单的 DDL sql ,并不复杂。最后哈,基本的 sql 能力是开发人员的必备项。
    lasuar
        14
    lasuar  
       56 天前
    @lasuar #9 纠正个小错误,是`docs/sql`目录,而不是直接的`docs/`目录。
    ninjashixuan
        15
    ninjashixuan  
       56 天前
    老实维护 sql 版本变更吧,这玩意还是手写让人踏实。
    mogging
        16
    mogging  
       56 天前
    GoFrame 统一管理
    liuhan907
        17
    liuhan907  
       56 天前
    @lasuar 能自动化的东西,为何要手动维护?
    fffq
        18
    fffq  
       56 天前
    yougg
        19
    yougg  
       56 天前
    https://github.com/yougg/awesome-go-orms

    已主推项目从 GORM 全面切换到 sqlc 了,包含几百张表/分表查询/各种关联查询/视图/存储过程等等,上生产稳定运行运行 1 年多。
    henix
        20
    henix  
       56 天前
    sqlc
    loading
        21
    loading  
       56 天前
    @liuhan907 #17 生产环境还是自己背锅比较好,因为有时因为 bug ,可能就丢了列甚至表。当然,用工具生成方案是对的,但依然要人工审查一次。
    james122333
        22
    james122333  
       56 天前 via Android
    记得没有 gorm 对类行改动好像很有问题
    我是自己根据 struct 的 tag 组成 sql 语法 从建立资料库 建立表栏位 更改表栏位语法都生成并运行
    rrfeng
        23
    rrfeng  
       56 天前
    仓库里单独建个目录放好用来改变的 sql ,做好版本记录。
    iyaozhen
        24
    iyaozhen  
       56 天前
    https://gorm.io/gen/
    字节内部用的这个,gorm 加强版

    可以连上数据库,生成 go 代码
    EscYezi
        25
    EscYezi  
       56 天前 via Android
    个人感觉有个工具能对比测试库和线上库的差异比较重要。表结构个人喜欢以数据库表为核心,映射用工具生成或者手写无所谓,只要字段对的上。按这个思路的话自动迁移其实可以不用
    cooltechbs
        26
    cooltechbs  
       56 天前 via Android
    @lasuar 同多年 Go 经验,完全同意你说的。

    另外就是新项目我基本都会给大家安利 MongoDB 和 Cassandra 这些 NoSQL ,直接避开 migration 问题。只要不是需要 transaction 的交易服务那些,NoSQL 绝对更省心(除非团队里都是 SQL 老油条)
    lasuar
        27
    lasuar  
       56 天前 via iPhone
    @cooltechbs 大部分项目,不管是技术栈熟悉程度还是事务的方面,类 MySQL 数据库都是避不开的。

    通过我说的方式来记录表结构,还有一个优势就是我不需要去完全学会那些 orm 库的各种 tag 语法。我个人认为哈,这东西完全对开发人员是一个多余的学习成本,虽然并不复杂,但是你耐不住他语法足够多还在不断更新,完全不利好语言新人。
    而且这玩意和语言绑定,我最讨厌和什么东西绑定了,我现在的一个微服务项目没有使用任何框架,就是 go 加上 grpc ,注册发现都是直接用的 k8s 的 service ,做到足够简洁,如果有开发新人,他不需要学习额外太多东西。
    nanpu
        28
    nanpu  
       56 天前
    gorm xorm ent
    lesismal
        29
    lesismal  
       56 天前
    如果不用 orm, 可以试试我这个 github.com/lesismal/sqlw
    lesismal
        30
    lesismal  
       56 天前
    @lasuar Can't agree more!
    Lychee0
        31
    Lychee0  
       56 天前 via Android
    gorm gen
    wwhontheway
        32
    wwhontheway  
       55 天前
    可以看看 gorm/gen or sqlc?
    hzzhzzdogee
        33
    hzzhzzdogee  
       55 天前
    gorm gen +1
    Kauruus
        34
    Kauruus  
       55 天前
    用 migrate 管理,但不自动执行。

    用 sqlc 生成 db 模型和查询。根据需要可以手工映射一次,隔离 db 实现。
    dododada
        35
    dododada  
       55 天前   ❤️ 1
    兄弟们 sql 上线没有 dba 审核的么?
    happy32199
        36
    happy32199  
       55 天前 via Android
    map[string]any
    hubqin
        37
    hubqin  
       55 天前
    @fffq 我是基于这个魔改的
    gvison
        38
    gvison  
       55 天前
    通过 sql 反向生成 go struct 映射数据库代码会更简单,连接数据库后,指定表来生成对应 gorm 的 struct 代码,https://go-sponge.com/ui/web-model
    guhuisec
        39
    guhuisec  
       55 天前
    我用的是这个,挺好用的,每次需要哪个表就生成一下: https://github.com/xxjwxc/gormt 我的配置文件:

    https://gist.github.com/haomiao33/9482a96c0ae8367a8a134ee0e9aab7a0
    ninjashixuan
        40
    ninjashixuan  
       54 天前
    怎么那么多人提 gorm gen 印象中这个只是 ddl -> orm model ,但是做不了 sql migrations 变更吧。
    liuhan907
        41
    liuhan907  
       54 天前
    @loading
    反正本来就有开发环境、测试环境、预发布环境三个环境做测试,如果还能让 DDL 错误上线的话那还是毁灭吧。
    另外,不用工具什么都自己手动做,那么在不用付出学习成本的同时也意味着什么事情都要自己花时间,并且不能享有开源项目发展带来的好处。我觉得这和现在的开发理念是背道而驰的。
    linghutf
        42
    linghutf  
       54 天前 via Android
    gentool
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4980 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:41 · PVG 13:41 · LAX 21:41 · JFK 00:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.