应用

在Beego Orm中,作者使用了go的反射机制,实现 1、通过数据模型建立数据表

type DataSheet struct { Name string orm:"NOT NULL" json:"name" //表名称 Type string orm:"NOT NULL" json:"type" //周期类型 日/月/季/年 Way string orm:"NOT NULL" json:"way" //生成方式 Time string orm:"NOT NULL" json:"time" //创建时间 Creator string orm:"NOT NULL" json:"creator" //制作人 }

在调用 orm.RegisterModel(new(DataSheet)) 后会自动生成名为 data_sheet 的数据表 2、通过模型中的tag > orm:"auto;pk" > orm:"rel(m2m)"

自动设置字段属性和表之间关系

完整代码

package main

import (
	"errors"
	"fmt"
	"reflect"
)

type DataSheet struct {
	Name    string `orm:"NOT NULL" json:"name"`    //表名称
	Type    string `orm:"NOT NULL" json:"type"`    //周期类型  日/月/季/年
	Way     string `orm:"NOT NULL" json:"way"`     //生成方式
	Time    string `orm:"NOT NULL" json:"time"`    //创建时间
	Creator string `orm:"NOT NULL" json:"creator"` //制作人
}

func main() {
	fmt.Println("=================================")
	sql, _ := registerModel(&DataSheet{
		Name: "模板名",
		Type: "周期类型",
		Way:  "生成方式",
		Time: "2017-01-01 00:00:00"})
	fmt.Println(sql)
}

//根据数据结构模型自动生成sql查询语句
func registerModel(models interface{}) (string, error) {
	valModels := reflect.ValueOf(models) //获取models内的值得指针位置
	indModels := reflect.Indirect(valModels)
	//检查传入类型,必须为指针类型
	if valModels.Kind() != reflect.Ptr {
		return "", errors.New("Invalid input models")
	}
	//输出数据模型名
	name := reflect.TypeOf(models).Name()
	fmt.Println("结构体名:", name)
	if indModels.NumField() == 0 {
		return "", errors.New("No valid fields")
	}
	//输出变量名 与 对应值
	for i := 0; i < indModels.NumField(); i++ {
		//获取字段
		k := indModels.Type().Field(i)
		fmt.Println("字段名:", k.Name, " 字段类型:", k.Type, " 字段标识:", k.Tag)
		//获取内容
		c := indModels.Field(i)
		if c.Kind() != reflect.Invalid {
			fmt.Println("内容:", c.String())
		}
		//fmt.Println("类型", c.Kind())

	}
	return name, nil
}

输出结果

================================= 结构体名: 字段名: Name 字段类型: string 字段标识: orm:“NOT NULL” json:“name” 内容: 模板名 字段名: Type 字段类型: string 字段标识: orm:“NOT NULL” json:“type” 内容: 周期类型 字段名: Way 字段类型: string 字段标识: orm:“NOT NULL” json:“way” 内容: 生成方式 字段名: Time 字段类型: string 字段标识: orm:“NOT NULL” json:“time” 内容: 2017-01-01 00:00:00 字段名: Creator 字段类型: string 字段标识: orm:“NOT NULL” json:“creator” 内容:

文章目录