ITPub博客

首页 > 数据库 > 数据库开发技术 > 周末,收到了5个bug提醒...

周末,收到了5个bug提醒...

原创 数据库开发技术 作者:皇子谈技术 时间:2024-05-20 08:00:00 0 删除 编辑

大家好,我是皇子。

周六,我发现我开源的一个项目gormstruct连续收到热心网友fengxueguan提交的bug邮件提醒,总计5个。

gormstruct是模型生成工具:根据MySQL数据库表名生成 golang gorm 模型和 DAO 层数据操作方法,详情可以查看历史文章《致敬,马斯克开源大模型Grok,我也开源一个模型生成工具!》

说实话,发现别人发现了自己没发现的问题,我是很兴奋的,想着赶快验证并解决。

因为周六白天在带娃,晚上去接刚来深圳的朋友见面吃饭。

周天在帮一个朋友写项目可行建议书,当天也是自己的生日,所以搁置着。

没想到网友fengxueguan主动提交了merge pull request,总计4条,过程很细心、完整!

时间原因,我今天校验了两个问题,做了一次 merge,并且优化了部分代码。剩下的问题,今天晚上尽量都验证并处理完。

下面展开说明一下这两个问题,另外今天520,文末还有彩蛋哦!

问题1:表/字段注释包含换行符,生成错误

测试的表结构

CREATE TABLE `user_base` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名 \\r 姓名',
`age` int(11) NOT NULL COMMENT '年龄 \\n 年龄',
`schoool` varchar(255) NOT NULL COMMENT '学校 \\r\\n 学校',
`name_1` varchar(255) NOT NULL COMMENT '姓名\n姓名换行',
PRIMARY KEY (`id`) USING BTREE,
KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8 COMMENT='用户基础表\n用户基础表换行';

生成错误的gorm模型

// 用户基础表
用户基础表换行
type UserBase struct {
ID int64 `gorm:"column:id;primaryKey;type:int(11);autoIncrement" json:"id"` // 主键id
Name string `gorm:"column:name;type:varchar(30);not null;" json:"name"` // 姓名 \r 姓名
Age int64 `gorm:"column:age;type:int(11);not null;" json:"age"` // 年龄 \n 年龄
Schoool string `gorm:"column:schoool;type:varchar(255);not null;" json:"schoool"` // 学校 \r\n 学校
Name1 string `gorm:"column:name_1;type:varchar(255);not null;" json:"name_1"` // 姓名
姓名换行
}

修复后

这是fengxueguang 提交的 merge pull request 修复代码,用于解决换行符问题

func (m *mysqlModel) lineBreakToBlank(str string) string {
s := strings.ReplaceAll(str, "\r\n", "")
s = strings.ReplaceAll(s, "\n", "")
return s
}
// 用户基础表
用户基础表换行
type UserBase struct {
ID int64 `gorm:"column:id;primaryKey;type:int(11);autoIncrement" json:"id"` // 主键id
Name string `gorm:"column:name;type:varchar(30);not null;" json:"name"` // 姓名 \r 姓名
Age int64 `gorm:"column:age;type:int(11);not null;" json:"age"` // 年龄 \n 年龄
Schoool string `gorm:"column:schoool;type:varchar(255);not null;" json:"schoool"` // 学校 \r\n 学校
Name1 string `gorm:"column:name_1;type:varchar(255);not null;" json:"name_1"` // 姓名姓名换行
}

发现提交的 merge pull request 遗漏了表换行的修复(可能后面其他我未审核和校验的代码中包含这部分)

所以在合并了代码之后,我稍微做了修改,用于保留原始的换行符,并且修复了表注释中包含换行的问题。

// 用户基础表\n用户基础表换行
type UserBase struct {
ID int64 `gorm:"column:id;primaryKey;type:int(11);autoIncrement" json:"id"` // 主键id
Name string `gorm:"column:name;type:varchar(30);not null;" json:"name"` // 姓名 \r 姓名
Age int64 `gorm:"column:age;type:int(11);not null;" json:"age"` // 年龄 \n 年龄
Schoool string `gorm:"column:schoool;type:varchar(255);not null;" json:"schoool"` // 学校 \r\n 学校
Name1 string `gorm:"column:name_1;type:varchar(255);not null;" json:"name_1"` // 姓名\n姓名换行
}

问题2:字段转换后出现冲突错误

如:order_id与orderId、name_1 与 name 在 gormstruct 工具生成表模型和dao方法后后会出现字段冲突和方法冲突的错误

fengxueguang 提交的merge pull request 中会检查冲突字段,如果冲突则加上后缀Gorm,然后继续检查是否冲突,冲突则继续加上后缀Gorm,以此类推。如果冲突达到99次,则抛出异常。

		for i := 2; i < 100; i++ { // 最多计算100次
if i >= 99 {
panic("表字段名重复次数超过99次,字段:" + columnName)
}

if _, ok := columnNameMap[columnName]; ok {
columnName = fmt.Sprintf("%s%s%d", columnName, "Gorm", i)
} else {
columnNameMap[columnName] = true
break
}
}

我的做法是,对于可能转换后存在字段冲突问题,我认为是字段定义不符合规范,直接抛出异常,简单处理。

		if oldFieldName, exist := columnNameMap[columnName]; !exist {
columnNameMap[columnName] = el.Name
} else {
errMsg := fmt.Sprintf("字段%s与字段%s定义存在冲突,建议修改字段定义后重新生成。", el.Name, oldFieldName)
panic(errMsg)
}


觉得有用,点个赞、在看或者转发 再走呀❤️



最后,最后,彩蛋来啦~~

我们的一支烟花AI社区产品烟花,重磅更新!

重点更新功能:允许设置定时任务

这个功能我很喜欢,也是在微信端很实用的一个功能

如:我们可以每天让烟花主动推送每日我们感兴趣的内容

所以我们团队不辞辛苦,赶上520这个时间点,为大家送上烟花满满的爱

(内测阶段,重复性和定时任务有上限)


💡关于烟花:

想学的都可以交给烟花!搜索+总结+解析+答疑+召回 为我们一步服务到位哦。

另外,想加入我们一支烟花AI社区学习交流群的加我微信,拉你入群~

原文作者:皇子谈技术;如有侵权,请联系管理员删除。

下一篇: 被嫌弃的视频...
请登录后发表评论 登录
全部评论

注册时间:2023-12-21

  • 博文量
    113
  • 访问量
    56522