gf icon indicating copy to clipboard operation
gf copied to clipboard

gf gen dao: 数据库表设计的字段名字不重复,生成的结构体重复,怎么处理?

Open buexplain opened this issue 1 month ago • 3 comments

What do you want to ask?

表设计:

CREATE TABLE `info` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `updateTime` timestamp NULL DEFAULT NULL COMMENT '记录更新时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='智能相关数据';

生成的结构体:

type Info struct {
  Id           uint        `json:"id"           orm:"id"            description:"自增ID"`                                                    // 自增ID
  UpdateTime   *gtime.Time `json:"updateTime"   orm:"updateTime"    description:"记录更新时间"`                                                  // 记录更新时间
  UpdateTime   *gtime.Time `json:"updateTime"   orm:"update_time"   description:"更新时间"`                                                    // 更新时间
}

我的问题是,能不能加个控制参数,字段名字与结构体名字保持一致,但是结构体的字段名字首字母大写, 类似生成于如下结构体:

type Info struct {
  Id           uint        `json:"id"           orm:"id"            description:"自增ID"`                                                    // 自增ID
  UpdateTime *gtime.Time `json:"updateTime"   orm:"updateTime"    description:"记录更新时间"`                                                  // 记录更新时间
  Update_time *gtime.Time `json:"update_time"   orm:"update_time"   description:"更新时间"`                                                    // 更新时间
}

buexplain avatar Nov 26 '25 08:11 buexplain

我的建议是不要为了“看起来像数据库字段”而牺牲 Go 语言的命名规范和工程实践。结构体是给 Go 程序员看的,不是给数据库看的。开发者关心的是语义,不是拼写形式。换成updated_at这种我觉得更合适,当然如果你的使用场景确实只能像你说的那么做,那就直接fork一下然后改一下gen内部用吧,也确实有时候会遇到一些很离谱的现实情况

LanceAdd avatar Nov 28 '25 03:11 LanceAdd

我的建议是不要为了“看起来像数据库字段”而牺牲 Go 语言的命名规范和工程实践。结构体是给 Go 程序员看的,不是给数据库看的。开发者关心的是语义,不是拼写形式。换成updated_at这种我觉得更合适,当然如果你的使用场景确实只能像你说的那么做,那就直接fork一下然后改一下gen内部用吧,也确实有时候会遇到一些很离谱的现实情况

就是为了尊重工程实践,我才搞模型生成,但是有些同事设计的表实在是变态,另外fork改动一下这个路子能解决问题,但是后续升级就不方便了。

buexplain avatar Nov 28 '25 09:11 buexplain

我的建议是不要为了“看起来像数据库字段”而牺牲 Go 语言的命名规范和工程实践。结构体是给 Go 程序员看的,不是给数据库看的。开发者关心的是语义,不是拼写形式。换成updated_at这种我觉得更合适,当然如果你的使用场景确实只能像你说的那么做,那就直接fork一下然后改一下gen内部用吧,也确实有时候会遇到一些很离谱的现实情况

就是为了尊重工程实践,我才搞模型生成,但是有些同事设计的表实在是变态,另外fork改动一下这个路子能解决问题,但是后续升级就不方便了。

还是尝试说服同事改一下表字段吧,毕竟大部分项目里一张表同时出现updateTimeupdate_time的时候按理说review的哥们应该开始骂人了,你要是实在想要可以提个PR试一下看看会不会合并

LanceAdd avatar Nov 28 '25 09:11 LanceAdd