golang的gormt和组合实战

牧笛工程师 · · 1690 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

有一个需求场景:

第一步:我们先在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不能用指针引入,会出现空指针情况;


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

本文来自:简书

感谢作者:牧笛工程师

查看原文:golang的gormt和组合实战

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

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