【Go】Beego Orm中反射的应用

目录

应用

在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”
内容:

展开阅读全文

没有更多推荐了,返回首页