MySql数据库表转换Go Struct(mysql to model)

xianghu1314 · 2019-05-13 11:46:14 · 5738 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-05-13 11:46:14 的主题,其中的信息可能已经有所发展或是发生改变。

项目地址

https://github.com/xianghu1314/mtm

mtm项目简介

MySql数据库表转换Go Struct(mysql to model)简称(mtm) 大型项目,一般采用数据库先行的设计方式,该工具很好的实现了从数据库到Go Struct代码的转换,减少了手动写Struct的时间。

使用方法

获取

go get github.com/xianghu1314/mtm

调用

//模型转换
t2s := mtm.CreateTableToStruct(&mtm.Options{
    MySqlUrl:                "XXX",
    FileName:                "Models.go",
    IfOneFile:               true,
    PackageName:             "Models",
    SavePath:                "./Models",
    IfToHump:                true,
    IfJsonTag:               true,
    IfPluralToSingular:      true,
    IfCapitalizeFirstLetter: true,
})
err := t2s.Run()
if err != nil {
    log.Fatal("模型转换:" + err.Error())
}

参数说明

type Options struct {
    MySqlUrl                string //数据库地址 DSN (Data Source Name) :[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]
    IfOneFile               bool   //多个表是否放在同一文件 true=同一文件 默认false
    FileName                string //文件名 当IfOneFile=true时有效 默认Models.go
    PackageName             string //自定义项目package名称 默认Models
    SavePath                string //保存文件夹 默认./Models
    IfToHump                bool   //是否转换驼峰 true=是 默认false
    IfJsonTag               bool   //是否包含json tag true=是 默认false
    IfPluralToSingular      bool   //是否复数转单数 true=是 默认false
    IfCapitalizeFirstLetter bool   //是否首字母转换大写 true=是 默认false
}

生成样例

CREATE TABLE `back_users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL COMMENT '真实姓名',
  `account` varchar(50) NOT NULL COMMENT '账号',
  `pwd` varchar(50) CHARACTER SET ascii NOT NULL COMMENT '密码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TABLE `entry_forms` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `tournament_id` int(11) NOT NULL,
  `name` varchar(50) NOT NULL COMMENT '姓名',
  `id_card` varchar(19) CHARACTER SET ascii NOT NULL COMMENT '身份证18位+x',
  `height` double(3,2) NOT NULL COMMENT '身高,单位cm',
  `weight` double(3,2) NOT NULL COMMENT '体重,单位kg',
  `age` tinyint(3) NOT NULL,
  `blood_type` varchar(2) NOT NULL COMMENT '血型',
  `phone` char(11) NOT NULL COMMENT '联系电话',
  `emergency_phone` char(11) NOT NULL COMMENT '紧急联系人电话',
  `gender` enum('male','female') NOT NULL,
  `status` tinyint(4) NOT NULL COMMENT '默认0 报名,-1退赛, 1领取赛事包, 2检录',
  `pay_status` bit(1) NOT NULL,
  `pay_log` varchar(500) NOT NULL,
  `amount` decimal(65,0) NOT NULL,
  `prepay_id` varchar(50) NOT NULL COMMENT '与支付id',
  `create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `fk_entryForms_tournaments_1` (`tournament_id`),
  KEY `fk_entry_forms_users_1` (`user_id`),
  CONSTRAINT `fk_entryForms_tournaments_1` FOREIGN KEY (`tournament_id`) REFERENCES `tournaments` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
package Models

import (
    "time"
)

type BackUser struct {
    Id      int    `json:"Id"`      //
    Name    string `json:"Name"`    //真实姓名
    Account string `json:"Account"` //账号
    Pwd     string `json:"Pwd"`     //密码
}
type EntryForm struct {
    Id             int       `json:"Id"`             //
    UserId         int       `json:"UserId"`         //
    TournamentId   int       `json:"TournamentId"`   //
    Name           string    `json:"Name"`           //姓名
    IdCard         string    `json:"IdCard"`         //身份证18位+x
    Height         float64   `json:"Height"`         //身高,单位cm
    Weight         float64   `json:"Weight"`         //体重,单位kg
    Age            int       `json:"Age"`            //
    BloodType      string    `json:"BloodType"`      //血型
    Phone          string    `json:"Phone"`          //联系电话
    EmergencyPhone string    `json:"EmergencyPhone"` //紧急联系人电话
    Gender         string    `json:"Gender"`         //
    Status         int       `json:"Status"`         //默认0 报名,-1退赛, 1领取赛事包, 2检录
    PayStatus      int       `json:"PayStatus"`      //
    PayLog         string    `json:"PayLog"`         //
    Amount         float64   `json:"Amount"`         //
    PrepayId       string    `json:"PrepayId"`       //与支付id
    CreateAt       time.Time `json:"CreateAt"`       //
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5738 次点击  ∙  1 赞  
加入收藏 微博
10 回复  |  直到 2023-07-27 11:54:17
jarlyyn
jarlyyn · #1 · 6年之前

只有struct么?

不是应该顺带生成一套crud么……

另外这种转换应该做成命令行工具把。

jarlyyn
jarlyyn · #2 · 6年之前

另外大概的看了下你的代码,还有个问题是你对一些保留单词没做处理

比如 id应该专成ID而不是Id url应该专程URL而不是Url,不然在ide里会提示warning

可以参考下

https://github.com/golang/lint/blob/470b6b0bb3005eda157f0275e2e4895055396a81/lint.go

里的

commonInitialisms

xianghu1314
xianghu1314 · #3 · 6年之前
jarlyynjarlyyn #1 回复

只有struct么? 不是应该顺带生成一套crud么…… 另外这种转换应该做成命令行工具把。

之所以没做成命令行工具,是因为我考虑把它放在main里面,每次启动自动同步数据库到struct

xianghu1314
xianghu1314 · #4 · 6年之前
jarlyynjarlyyn #1 回复

只有struct么? 不是应该顺带生成一套crud么…… 另外这种转换应该做成命令行工具把。

初衷只是做数据库到go 代码的映射,如果做crud就是一套ORM框架了,而且CRUD使用模板也可以快速生成,感觉没有必要。

xianghu1314
xianghu1314 · #5 · 6年之前
jarlyynjarlyyn #2 回复

另外大概的看了下你的代码,还有个问题是你对一些保留单词没做处理 比如 id应该专成ID而不是Id url应该专程URL而不是Url,不然在ide里会提示warning 可以参考下 https://github.com/golang/lint/blob/470b6b0bb3005eda157f0275e2e4895055396a81/lint.go 里的 commonInitialisms

可能各个项目使用的习惯不太一样,我觉得首字母大写更符合Go的代码风格。image.png 我试了一下Url在GoLand并没有提示warning,可能是我们使用的版本不太一样。

jarlyyn
jarlyyn · #6 · 6年之前

是不是没开go-lint

2019-05-13 16-03-58 的屏幕截图.png

pislbert
pislbert · #7 · 6年之前

为什么不用xorm。。。

jarlyyn
jarlyyn · #8 · 6年之前
pislbertpislbert #7 回复

为什么不用xorm。。。

不想用orm很正常的。

我也不用orm的。

jigetage
jigetage · #9 · 5年之前

这个工具挺好用的 https://dev.ataotaoa.com ,mysql建表语句转golang的struct

mowen
mowen · #10 · 2年之前

这个工具也挺好用的,http://sql2struct.atotoa.com/

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传