有一个需求场景:
第一步:我们先在mysql建一个表格api_dubbo
CREATE TABLE `api_dubbo` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`domain` varchar(50) DEFAULT NULL COMMENT '域名',
`interface` varchar(128) DEFAULT NULL COMMENT '接口',
`method` varchar(64) DEFAULT NULL COMMENT '方法',
`service_id` varchar(128) DEFAULT NULL COMMENT '服务标识',
`idc_type` varchar(16) DEFAULT NULL COMMENT '机房类型;mars/m7/idc;',
`create_time` timestamp default current_timestamp COMMENT '创建时间',
`update_time` timestamp default current_timestamp COMMENT '更新时间',
`stat` tinyint(4) DEFAULT '0' COMMENT '状态:0显示,1隐藏',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_id` (`domain`,`interface`,`method`),
KEY `idx_service_id` (`service_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='dubbo接口表' ;
第二步:然后利用gormt生成一个表结构
效果如:
// APIDubbo dubbo接口表
type APIDubbo struct {
ID int64 `gorm:"primary_key" json:"-"` // 自增ID
Domain string `gorm:"unique_index:uk_id" json:"domain"` // 域名
Interface string `gorm:"unique_index:uk_id" json:"interface"` // 接口
Method string `gorm:"unique_index:uk_id" json:"method"` // 方法
ServiceID string `gorm:"index" json:"service_id"` // 服务标识
IDcType string `json:"idc_type"` // 机房类型;mars/m7/idc;
CreateTime base.XTime `json:"create_time"` // 创建时间
UpdateTime base.XTime `json:"update_time"` // 更新时间
Stat int8 `json:"stat"` // 状态:0显示,1隐藏
}
// TableName get sql table name.获取数据库表名
func (m *APIDubbo) TableName() string {
return "api_dubbo"
}
这个结构是自动生成的,还可以兼容swagger文档导入,所以效果还是赞赞的;
问题1
当我们去json输出的时候,发现主键没有输出出来;因为被-代替了;
方案
手动修改为ID,外显;如果嫌麻烦,可以用shell来固定替换;
sed -i '' '/ID/ s/json:"-"/json:"ID"/g' api.go
问题2
当我们select、update、delete时,如果还用POST进行json body的输入,则会导致冗余字段很多,比如update_time和create_time字段,并不需要对方输入,如果我们-隐藏,则无法对外展示;这个时候就有点左右为难了。
方案
利用组合的特性,将部分字段提取到一个单独的结构中,再组合进来;
既能单独操作输入字段,又能够保持gormt的特性;可谓是一举两得;
package main
import (
"fmt"
"time"
)
type APIDubboInput struct {
Domain string `gorm:"unique_index:uk_id" json:"domain"` // 域名
Interface string `gorm:"unique_index:uk_id" json:"interface"` // 接口
Method string `gorm:"unique_index:uk_id" json:"method"` // 方法
ServiceID string `gorm:"index" json:"service_id"` // 服务标识
IDcType string `json:"idc_type"` // 机房类型
}
type APIDubbo struct {
APIDubboInput
ID int64 `gorm:"primary_key" json:"ID"` // 自增ID
CreateTime time.Time `json:"create_time"` // 创建时间
UpdateTime time.Time `json:"update_time"` // 更新时间
Stat int8 `json:"stat"` // 状态
}
func main() {
obj := &APIDubbo{}
obj.Domain = "one"
fmt.Println(obj.APIDubboInput.Domain)
obj1 := APIDubboInput{
Domain: "test.com",
Interface: "interface.pkg",
}
obj.APIDubboInput = obj1
fmt.Println(obj.Domain)
}
注意,APIDubboInput不能用指针引入,会出现空指针情况;
有疑问加站长微信联系(非本文作者)