前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >db2gorm -- 将mysql数据表转为gorm struct

db2gorm -- 将mysql数据表转为gorm struct

作者头像
跑马溜溜的球
发布于 2021-06-09 14:46:40
发布于 2021-06-09 14:46:40
2.5K00
代码可运行
举报
文章被收录于专栏:日积月累1024日积月累1024
运行总次数:0
代码可运行

0. 为什么写这样一个工具

  • 找到的开源工具功能比较多,用起来也复杂些
  • 自己定制的更适合自己的项目
  • 方便集成到gin
  • 学习go时间不长,写一款工具也是练习的过程

项目地址 https://github.com/qmhball/db2gorm

1. 功能

根据数据库表生成gorm需要的struct。支持指定单表生成,也可以全库生成。

比如有如下数据表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Table: User
Create Table: CREATE TABLE `User` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  `age` int(11) NOT NULL DEFAULT '-1',
  `is_admin` tinyint(1) NOT NULL DEFAULT '0',
  `is_valid` tinyint(1) NOT NULL DEFAULT '1',
  `login_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8 COMMENT='用户表'

db2gorm可以在指定的目录下生成 user/user.go,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package user

type User struct{
    ID uint32 
    Name string 
    Age int `gorm:"default:-1"`
    IsAdmin bool `gorm:"default:0"`
    IsValid bool `gorm:"default:1"`
    LoginTime time.Time `gorm:"default:CURRENT_TIMESTAMP"`
}

2. 使用

2.1 指定单表生成文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "git.sogou-inc.com/bpd-dhlib/db2gorm/gen"
)

dsn := "root:user237@tcp(10.10.10.10:3306)/mydb?charset=utf8&parseTime=true&loc=Local"
        
//生成指定单表
tblName := "User"
gen.GenerateOne(gen.GenConf{
    Dsn:       dsn,
    WritePath: "./model",
    Stdout:    false,
    Overwrite: true,
}, tblName)

gen.GenConf的说明如下:

  • Dsn:数据库配置
  • WritePath:指定文件写入的目录。生成前目录一定要存在。上例中会在model目录下生成user/user.go
  • Stdout:是否输出至标准输出。如果Stdout为true,则生成的struct不会写入文件。
  • Overwrite:当原文件存在时,是否进行覆盖。true为覆盖。

2.2 全库生成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    gen.GenerateAll(gen.GenConf{
        Dsn:       dsn,
        WritePath: "./model",
        Stdout: false,
        Overwrite: true,
    })

3. 推荐的数据库配置

建议使用gorm v1.2以上版本(v1.1*的版本和v1.2差别比较大)

建议gorm.Open时指定SingularTable为true,即使用单数表名。这样就不必在struct上定义TableName方法指定表名了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        gorm.Open(mysql.New(mysql.Config{
			DSN:dsn,
		}), &gorm.Config{
			NamingStrategy:schema.NamingStrategy{
			    //单数表名
				SingularTable: true,
			},
		})

4. 生成规则

4.1 表名

表名对应的大驼峰命名做为struct名,全小写表名做为目录名,文件名和包名。 比如表名为demo_test, 则:

  • struct名:DemoTest
  • 目录名:demotest
  • 文件名:demotest.go
  • 包名:demotest

4.2 字段名

表名对应的大驼峰命名做为struct字段名。比如is_admin对应IsAdmin。但id字段除名,id固定对应ID。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/06/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验