gorm建表的几种方式

type AbcMenu struct {
    basedto.BaseEntity `gorm:"-"`
    *basemodel.BaseModel
    /*    */
    Id int64 `gorm:"column:id;type:INT8;PRIMARY_KEY;default:unique_rowid()" json:"id"`
    /*    */
    WebsiteId int64 `gorm:"column:website_id;type:INT8" json:"website_id"`

    /*    */
    Keyword string `gorm:"column:keyword;type:STRING" json:"keyword"`
}


// 指定表名
// InsertIfNotExists
func (this *TestQueryRequest) Test114_automigrate_defineTablename() {

    var req = pagereq.NewQueryRequest()
    req.GetDB().Table("abc").AutoMigrate(AbcMenu{})

}

// 默认表名struct名
func (this *TestQueryRequest) Test115_automigrate_defineTablenameAuto() {

    var req = pagereq.NewQueryRequest()
    req.GetDB().AutoMigrate(AbcMenu{})

}

// tabler接口定义
func (this *TestQueryRequest) Test116_automigrate_interfacedefineTablename() {

    var req = pagereq.NewQueryRequest()
    req.GetDB().AutoMigrate(AbcMenu{})

}
func (self AbcMenu) TableName() string {
    return "abc_menu1"
}

// 动态结构体
func (this *TestHttpCliQuerySuite) Test118_automigrate() {

    var req = pagedb.DefaultDbGroup()
    req.SetTableName("service_api_list")
    var r, _ = req.CreateTableRecord()

    req.GetDB().Table("abc23").AutoMigrate(r)

}

func (self *PagedbGroup) CreateTableRecord() (any, error) {

    var entity, err = self.CreateTableStru()

    if err != nil {
       return nil, err
    }
    var r = entity.Addr().Interface()

    return r, err
}

func (self *PagedbGroup) CreateTableStru() (reflect.Value, error) {

    var metadata = self.metadataFactroy.FindMetaTable(self.TableName)
    if !metadata.TableExist {
       return reflect.ValueOf(nil), errors.New("table not exist")
    }
    return self.CreateDbTableStru(metadata), nil
}
func (self *PagedbGroup) CreateDbTableStru(meta *dbpkgdto.MetaTableDto) reflect.Value {

    var metaColService = self.metadataFactroy //service.FindMetadataFactroy(self.DbClientDto)
    dbFields := []reflect.StructField{}

    var colField = reflect.StructField{
       Name:      "BaseEntity",
       Type:      reflect.TypeOf(basedto.BaseEntity{}),
       Tag:       `json:"-"`,
       Anonymous: true,
    }
    dbFields = append(dbFields, colField)

    for _, col := range meta.Columns {

       var colType = metaColService.FindGoType(col.DataType)
       var ColTyp8 = reflect.TypeOf(int8(0))

       var ct = func(colType string) *reflect.Type {
          var ColTyp = reflect.TypeOf(int8(0))
          switch colType {
          case "float32":
             ColTyp = reflect.TypeOf(float32(0))
          case "float64":
             ColTyp = reflect.TypeOf(float64(0))
          case "int64":
             ColTyp = reflect.TypeOf(int64(0))
          case "int32":
             ColTyp = reflect.TypeOf(int32(0))
          case "int16":
             ColTyp = reflect.TypeOf(int16(0))
          case "uint64":
             ColTyp = reflect.TypeOf(uint64(0))
          case "uint32":
             ColTyp = reflect.TypeOf(uint32(0))
          case "uint16":
             ColTyp = reflect.TypeOf(uint16(0))
          case "string":
             ColTyp = reflect.TypeOf("")
          case "bool":
             ColTyp = reflect.TypeOf(true)
          case "byte":
             ColTyp = reflect.TypeOf(byte(0))
          case "[]byte":
             ColTyp = reflect.TypeOf([]byte{})

          case "time.Time":
             ColTyp = reflect.TypeOf(time.Now())
             if col.ColumnName == "deleted_at" {
                var t *time.Time
                ColTyp = reflect.TypeOf(t)

             }

          }
          return &ColTyp
       }(colType)

       if ColTyp8 != *ct {
          if self.IfExistField(col.ColumnName) {
             var name = stringutils.Case2Camel(col.ColumnName)
             name = strings.ReplaceAll(name, ",", "")
             var colField = reflect.StructField{
                Name: name,
                Type: *ct,
                Tag:  reflect.StructTag(fmt.Sprintf("json:\"%s\"", col.ColumnName)),
             }
             //or primary key
             if col.ColumnName == "id" && col.DataType == "int8" {
                colField.Tag = reflect.StructTag(`gorm:"column:id;type:INT8;PRIMARY_KEY;default:unique_rowid()" json:"id"`)
             } else if self.FindPkName() == col.ColumnName {
                colField.Tag = reflect.StructTag(strings.ReplaceAll(`gorm:"column:id;type:INT8;PRIMARY_KEY" json:"`+col.ColumnName+`"`, "id", col.ColumnName))

             }
             dbFields = append(dbFields, colField)
          }
       }
    }

    dbtableType := reflect.StructOf(dbFields)
    return reflect.New(dbtableType).Elem()

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leijmdas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值