# 專案地址
https://github.com/xianghu1314/mtm
# mtm專案簡介
MySql資料庫表轉換Go Struct(mysql to model)簡稱(mtm)
大型專案,一般采用資料庫先行的設計方式,該工具很好的實作了從資料庫到Go Struct代碼的轉換,減少了手動寫Struct的時間。
# 使用方法
#### 獲取
go get github.com/xianghu1314/mtm
#### 呼叫
```go
//模型轉換
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())
}
```
#### 引數說明
```go
type Options struct {
MySqlUrl string //資料庫地址 DSN (Data Source Name) :[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=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;
```
```go
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"` //
}
```
uj5u.com熱心網友回復:
只有struct么?不是應該順帶生成一套crud么……
另外這種轉換應該做成命令列工具把。
uj5u.com熱心網友回復:
另外大概的看了下你的代碼,還有個問題是你對一些保留單詞沒做處理比如 id應該專成ID而不是Id
url應該專程URL而不是Url,不然在ide里會提示warning
可以參考下
https://github.com/golang/lint/blob/470b6b0bb3005eda157f0275e2e4895055396a81/lint.go
里的
commonInitialisms
uj5u.com熱心網友回復:
之所以沒做成命令列工具,是因為我考慮把它放在main里面,每次啟動自動同步資料庫到structuj5u.com熱心網友回復:
初衷只是做資料庫到go 代碼的映射,如果做crud就是一套ORM框架了,而且CRUD使用模板也可以快速生成,感覺沒有必要。uj5u.com熱心網友回復:
可能各個專案使用的習慣不太一樣,我覺得首字母大寫更符合Go的代碼風格。uj5u.com熱心網友回復:
是不是沒開go-lintuj5u.com熱心網友回復:
為什么不用xorm。。。uj5u.com熱心網友回復:
不想用orm很正常的。我也不用orm的。
uj5u.com熱心網友回復:
這個工具挺好用的 https://dev.ataotaoa.com ,在線將mysql建表陳述句轉golang的struct結構體轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/117904.html
標籤:其他技術討論專區
上一篇:r語言分析作者合作網路的時候
