GEN 是一个基于 GORM 的安全 ORM 框架, 由字节跳动无恒实验室与 GORM 作者联合研发,主要功能说白了就是帮助生成数据表对应的模型文件和更安全方便地执行SQL。
直接使用 GORM 与 GEN 工具的对比:
直接使用GORM 使用GEN 需手动创建与数据表各列一一对应的结构体 指定表名后自动读取并生成对应结构体 需手动实现具体的 go 代码查询逻辑 描述 SQL 查询逻辑即可,工具自动转换成安全稳定的代码 查询接口十分灵活,但不能保持查询的 SQL 不发生语法错误,
只能通过测试保证部分场景的正常运行查询接口使用类型安全,编译可通过,查询逻辑即是正常合理的 需人工评经验保证业务不存在安全问题,
一旦出错往往在上线前才能发现,影响上线流程提供的安全可靠的查询 API,开发时能用的就是安全的
GEN 提供的功能是强大而丰富的,本文相当一个上手指引只挑些常见操作进行示例说明:
balance 在表中是 DECIMAL 类型,结构体中是 int64,业务需要的 json 字段类型为字符串。示例环境:
目标表有3个,分别是 user、address和 hobby,user与 address是一对多关系,如下所示:
CREATE TABLE IF NOT EXISTS `user` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户名',
`age` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '年龄',
`balance` decimal(11,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '余额',
`updated_at` datetime NOT NULL COMMENT '更新时间',
`created_at` datetime NOT NULL COMMENT '创建时间',
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE IF NOT EXISTS `address` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`uid` int unsigned NOT NULL,
`province` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
`city` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
`update_time` int unsigned NOT NULL,
`create_time` int unsigned NOT NULL,
`delete_time` int unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`) USING BTREE,
KEY `uid` (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
CREATE TABLE IF NOT EXISTS `hobby` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT