GEN 自动生成 GORM 模型结构体文件及使用示例

GEN 自动生成 GORM 模型结构体文件及使用示例

背景

GEN 是一个基于 GORM 的安全 ORM 框架, 由字节跳动无恒实验室与 GORM 作者联合研发,主要功能说白了就是帮助生成数据表对应的模型文件和更安全方便地执行SQL。

直接使用 GORM 与 GEN 工具的对比:

直接使用GORM 使用GEN
需手动创建与数据表各列一一对应的结构体 指定表名后自动读取并生成对应结构体
需手动实现具体的 go 代码查询逻辑 描述 SQL 查询逻辑即可,工具自动转换成安全稳定的代码
查询接口十分灵活,但不能保持查询的 SQL 不发生语法错误,
只能通过测试保证部分场景的正常运行
查询接口使用类型安全,编译可通过,查询逻辑即是正常合理的
需人工评经验保证业务不存在安全问题,
一旦出错往往在上线前才能发现,影响上线流程
提供的安全可靠的查询 API,开发时能用的就是安全的

本文目标

GEN 提供的功能是强大而丰富的,本文相当一个上手指引只挑些常见操作进行示例说明:

  • 表字段的整型类型无论大小和有无符号,结构体中统一使用 int64 (为了简化后续使用时的操作)。
  • 个别结构体字段 json 序列化时由数字类型转成字符串类型,如:余额字段 balance 在表中是 DECIMAL 类型,结构体中是 int64,业务需要的 json 字段类型为字符串。
  • 使用非默认字段名实现自动更新、创建时间戳和软删除。
  • 模型关联

示例环境:

  • go 1.18
  • gen v0.3.16 注意:当前GEN的最新版主版本是0, 也就是 API 在未来可能会有较大的变更, 使用时务必注意版本变更问题
  • MySQL 8.0

目标表有3个,分别是 useraddresshobbyuseraddress是一对多关系,如下所示:

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 

你可能感兴趣的:(Golang,golang,gorm,gen,mysql)