实际项目中使用gorm-gen来生成实体类

这篇具有很好参考价值的文章主要介绍了实际项目中使用gorm-gen来生成实体类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、为什么要使用gorm-gen来生成实体类和查询

  • 1、根据gorm官网地址,正常的写法是先写数据模型,然后由数据模型自动同步生成到数据库中,但是这样的工作量会比较大,对于写后端的人来说都熟悉sql语句,正常来说都是先自己手动创建表,利用工具将表字段同步到项目实体类中,之前我就写过一个这样的工具,对于小项目来说都能满足

  • 2、使用上面的方式在项目中写出的代码大概是如此,这样如果数据库字段改了,程序是无法识别出来,不能很好的规避错误

    实际项目中使用gorm-gen来生成实体类

  • 3、gorm-gen刚好可以满足这个需求,写出的代码更好的维护,比如下面的代码

    实际项目中使用gorm-gen来生成实体类

二、在项目中配置gorm-gen来生成sql操作

  • 1、手动新创建表

    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user`  (
      `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
      `username` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '用户名',
      `age` int UNSIGNED NOT NULL COMMENT '年龄',
      `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '密码',
      `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
      `deleted_at` timestamp NULL DEFAULT NULL COMMENT '软删除时间',
      `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '手机号码',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
    
  • 2、根据官网来安装依赖包

    go get -u gorm.io/gen
    go get -u gorm.io/driver/mysql
    
  • 3、在项目的根目录下创建一个generate.go的文件

    package main
    
    import (
     "fmt"
     "gorm.io/driver/mysql"
     "gorm.io/gen"
     "gorm.io/gen/field"
     "gorm.io/gorm"
     "strings"
    )
    
    const dsn = "root:123456@(localhost:3306)/test001?charset=utf8mb4&parseTime=True&loc=Local"
    
    // Case2Camel 下划线转驼峰(大驼峰)
    func Case2Camel(name string) string {
     name = strings.Replace(name, "_", " ", -1) // 根据_来替换成
     name = strings.Title(name)                 // 全部大写
     return strings.Replace(name, " ", "", -1)  // 删除空格
    }
    
    // LowerCamelCase 转换为小驼峰
    func LowerCamelCase(name string) string {
     name = Case2Camel(name)
     return strings.ToLower(name[:1]) + name[1:]
    }
    func main() {
     var tableName string
     fmt.Print("请输入表名,如果不输入将全部同步数据库:")
     if _, err := fmt.Scanln(&tableName); err != nil {
        fmt.Println("没有输入表名将全部同步数据库", err.Error())
     }
     var fileName = Case2Camel(tableName) // 转为首字目大写
     fmt.Println(fileName)
     // 连接数据库
     db, err := gorm.Open(mysql.Open(dsn))
     if err != nil {
        panic(fmt.Errorf("cannot establish db connection: %w", err))
     }
    
     // 构造生成器实例
     g := gen.NewGenerator(gen.Config{
        // 相对执行`go run`时的路径, 会自动创建目录
    
        OutPath:      "./dao",   //curd代码的输出路径
        ModelPkgPath: "./model", //model代码的输出路径
    
        // WithDefaultQuery 生成默认查询结构体(作为全局变量使用), 即`Q`结构体和其字段(各表模型)
        // WithoutContext 生成没有context调用限制的代码供查询
        // WithQueryInterface 生成interface形式的查询代码(可导出), 如`Where()`方法返回的就是一个可导出的接口类型
        Mode: gen.WithDefaultQuery | gen.WithoutContext | gen.WithQueryInterface,
    
        // 表字段可为 null 值时, 对应结体字段使用指针类型
        FieldNullable: false, // generate pointer when field is nullable
    
        // 表字段默认值与模型结构体字段零值不一致的字段, 在插入数据时需要赋值该字段值为零值的, 结构体字段须是指针类型才能成功, 即`FieldCoverable:true`配置下生成的结构体字段.
        // 因为在插入时遇到字段为零值的会被GORM赋予默认值. 如字段`age`表默认值为10, 即使你显式设置为0最后也会被GORM设为10提交.
        // 如果该字段没有上面提到的插入时赋零值的特殊需要, 则字段为非指针类型使用起来会比较方便.
        FieldCoverable: false, // generate pointer when field has default value, to fix problem zero value cannot be assign: https://gorm.io/docs/create.html#Default-Values
    
        // 模型结构体字段的数字类型的符号表示是否与表字段的一致, `false`指示都用有符号类型
        FieldSignable: false, // detect integer field's unsigned type, adjust generated data type
        // 生成 gorm 标签的字段索引属性
        FieldWithIndexTag: false, // generate with gorm index tag
        // 生成 gorm 标签的字段类型属性
        FieldWithTypeTag: true, // generate with gorm column type tag
     })
     // 设置目标 db
     g.UseDB(db)
    
     // 自定义字段的数据类型
     // 统一数字类型为int64,兼容protobuf和thrift
     dataMap := map[string]func(detailType gorm.ColumnType) (dataType string){
        "tinyint":   func(detailType gorm.ColumnType) (dataType string) { return "int64" },
        "smallint":  func(detailType gorm.ColumnType) (dataType string) { return "int64" },
        "mediumint": func(detailType gorm.ColumnType) (dataType string) { return "int64" },
        "bigint":    func(detailType gorm.ColumnType) (dataType string) { return "int64" },
        "int":       func(detailType gorm.ColumnType) (dataType string) { return "int64" },
        "timestamp": func(detailType gorm.ColumnType) (dataType string) { return "LocalTime" }, // 自定义时间
        "decimal":   func(detailType gorm.ColumnType) (dataType string) { return "Decimal" },   // 金额类型全部转换为第三方库,github.com/shopspring/decimal
     }
     // 要先于`ApplyBasic`执行
     g.WithDataTypeMap(dataMap)
    
     // 自定义模型结体字段的标签
     // 将特定字段名的 json 标签加上`string`属性,即 MarshalJSON 时该字段由数字类型转成字符串类型
     jsonField := gen.FieldJSONTagWithNS(func(columnName string) (tagContent string) {
        toStringField := `id, `
        if strings.Contains(toStringField, columnName) {
           return columnName + ",string"
        } else if strings.Contains(`deleted_at`, columnName) {
           return "-"
        }
        return LowerCamelCase(columnName) // 下划线转小驼峰
     })
     // 将非默认字段名的字段定义为自动时间戳和软删除字段;
     // 自动时间戳默认字段名为:`updated_at`、`created_at, 表字段数据类型为: INT 或 DATETIME
     // 软删除默认字段名为:`deleted_at`, 表字段数据类型为: DATETIME
     autoUpdateTimeField := gen.FieldGORMTag("updated_at", func(tag field.GormTag) field.GormTag {
        return map[string]string{
           "column":  "updated_at",
           "comment": "更新时间",
        }
     })
     autoCreateTimeField := gen.FieldGORMTag("created_at", func(tag field.GormTag) field.GormTag {
        return map[string]string{
           "column":  "created_at",
           "comment": "创建时间",
        }
     })
     softDeleteField := gen.FieldType("deleted_at", "gorm.DeletedAt")
     // 模型自定义选项组
     fieldOpts := []gen.ModelOpt{jsonField, autoCreateTimeField, autoUpdateTimeField, softDeleteField}
     //fieldOpts := []gen.ModelOpt{jsonField, softDeleteField}
    
     // 创建模型的结构体,生成文件在 model 目录; 先创建的结果会被后面创建的覆盖
     // 这里创建个别模型仅仅是为了拿到`*generate.QueryStructMeta`类型对象用于后面的模型关联操作中
     //User := g.GenerateModel("user")
     // 如果传递了表名的时候就单独创建单独的表
     if tableName != "" {
        //allModel := g.GenerateAllTable(fieldOpts...)
        allModel := g.GenerateModelAs(tableName, fileName, fieldOpts...)
        // 创建有关联关系的模型文件
        // 可以用于指定外键
        //Score := g.GenerateModel("score",
        // append(
        //    fieldOpts,
        //    // user 一对多 address 关联, 外键`uid`在 address 表中
        //    gen.FieldRelate(field.HasMany, "user", User, &field.RelateConfig{GORMTag: "foreignKey:UID"}),
        // )...,
        //)
    
        // 创建模型的方法,生成文件在 query 目录; 先创建结果不会被后创建的覆盖
        //g.ApplyBasic(User)
        g.ApplyBasic(allModel)
     } else {
        allModel := g.GenerateAllTable(fieldOpts...)
        g.ApplyBasic(allModel...)
     }
    
     g.Execute()
    }
    
  • 4、在utils文件夹下创建一个db.go的文件,这个地方是连接数据库的,先运行上面的文件才会生成dao文件

    const dsn = "root:123456@(localhost:3306)/test001?charset=utf8mb4&parseTime=True&loc=Local"
    
    var DB = dao.Query{}
    
    func InitDB() {
     db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
        Logger:                                   logger.Default.LogMode(logger.Info),
        DisableForeignKeyConstraintWhenMigrating: true, // 自动创建表的时候不创建外键
        NamingStrategy: schema.NamingStrategy{ // 自动创建表时候表名的配置
           SingularTable: true,
        },
     })
     if err != nil {
        panic(err)
     }
        // 进行关联
     dao.SetDefault(db)
     q := dao.Q
     DB = *q
    }
    
    func init() {
     InitDB()
    }
    
  • 5、可以正常使用内置封装好的方法了,本案例地址文章来源地址https://www.toymoban.com/news/detail-493580.html

到了这里,关于实际项目中使用gorm-gen来生成实体类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django框架:使用channels实现websocket,配置和项目实际使用

    依赖包: 项目目录结构: study_websocket         --study_websocket                 --__init__.py                 --settings.py                 --asgi.py                 --wsgi.py                 --urls.py         --chat                 --routing

    2024年02月15日
    浏览(40)
  • Django3框架-(2)-[使用websocket]:使用channels实现websocket,配置和项目实际使用

    依赖包: 项目目录结构: study_websocket         --study_websocket                 --__init__.py                 --settings.py                 --asgi.py                 --wsgi.py                 --urls.py         --chat                 --routing

    2024年01月18日
    浏览(39)
  • 【Vue】Vue中mixins的使用方法及实际项目应用详解

    (1)mixin基础 官网解释(Vue2.x): 混入(mixin)提供了一种非常灵活的方式,来分发Vue组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。 如何理解mixins?我们可以将mixins理解成一

    2023年04月09日
    浏览(58)
  • 使用idea实现git操作大全(在项目开发中遇到的实际情况

    选中需要拉的分支,右键该分支,选中new breach from “分支”,点击后,给新建分支命名。 在自己分支开发完毕后,需要合并到sit分支上。 合并到sit分支上有两种方法 1.如果你是从sit分支拉的分支,那么你可以右键分支,选择merge “自己的分支” into “sit分支” 2.如果你不是

    2024年02月14日
    浏览(36)
  • mac 版 Nginx 的使用及 web 项目的实际部署--最简单的方式

    1.1 终端输入指令: which brew 如果显示如下图, 则证明已安装, 如果未安装, 终端执行如下指令: 检查是否安装成功, 执行指令: brew -v 执行指令: 检查是否已经安装完成, 执行指令: nginx -v 如下图所示, 代表已经安装成功; 简单介绍几种常用指令: 启动指令: nginx 或者是 sudo nginx 重启

    2024年02月16日
    浏览(32)
  • 【IDEA使用指南】使用Hibernate框架的Java项目,如何通过数据库表自动生成实体模型?

    步骤1:找到并打开“Persistence”工具栏。 如下图所示,找到 “View - Tool Windows - Persistence”,点击“Persistence”。 步骤2:找到并打开“Import Database Schema” 窗口。 在开发工具左下角会弹出持久化配置的工具栏“Persistence”,如下图所示。单击之后有一个弹框,找到弹框中的项

    2024年02月05日
    浏览(65)
  • Gorm 入门介绍与基本使用

    目录 Gorm 入门介绍与基本使用 一、ORM简介 1.1 什么是ORM 1.2 使用ORM的好处 1.2.1 避免直接操作SQL语句 1.2.2 提高代码的可维护性 1.2.3 跨数据库兼容性 1.3 使用ORM的缺点 1.3.1 学习成本 1.3.2 性能开销 1.4 ORM解析过程 1.4.1 模型定义 1.4.2 数据验证 1.4.3 映射关系 1.4.4 CRUD操作 1.4.5 SQL生成

    2024年02月03日
    浏览(36)
  • Gorm 关联关系介绍与基本使用

    目录 一 Belongs To(一对一) 1.1 Belongs To 1.2 重写外键 1.3 重写引用(一般不用) 1.4 Belongs to 的 CRUD 1.5 预加载 1.6 外键约束 二、Has One 2.1 Has One 2.2 重写外键 2.3 重写引用 2.4 多态关联 2.5 Has One 的 CURD 2.6 预加载 2.7 自引用 Has One 2.8 外键约束 三、Has Many 3.1 Has Many 3.2 重写外键 3.3 重写引用

    2024年02月02日
    浏览(32)
  • Runway 使用说明,Gen2 AI

    目录 管理Assets 时间轴 图层 快捷操作 人工智能魔术工具 1.导入视频剪辑 2. 绿屏 3. export 4.Inpainting 5.Motion Tracking 6. 超慢动作 字幕 上传 Assets 在 Runway 中处理任何媒体都需要先上传它。从本地硬盘或硬盘驱动器上传视频或图像可将其用于 Runway 项目。与所有其他编辑软件类似,

    2024年02月02日
    浏览(47)
  • 使用 GORM 连接数据库并实现增删改查操作

    首先,我们需要安装 GORM 包。在终端中运行以下命令: shell go get -u gorm.io/gorm 在 Go 代码的开头导入以下包: 在代码中建立数据库连接,示例中使用 MySQL 数据库作为示范: 请确保替换 user 、 password 和 dbname 为你的实际数据库凭据和名称。 在 GORM 中,我们需要定义模型结构来

    2024年02月15日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包