日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

beego mysql 存储过程_ioioj5

發(fā)布時(shí)間:2025/3/15 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 beego mysql 存储过程_ioioj5 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文主要研究一下gorm的Model

Model

gorm.io/gorm@v1.20.10/model.go// Model a basic GoLang struct which includes the following fields: ID, CreatedAt, UpdatedAt, DeletedAt

// It may be embedded into your model or you may build your own model without it

// type User struct {

// gorm.Model

// }

type Model struct {

ID uint `gorm:"primarykey"`

CreatedAt time.Time

UpdatedAt time.Time

DeletedAt DeletedAt `gorm:"index"`

}Model定義了ID、CreatedAt、UpdatedAt、DeletedAt屬性

ParseField

gorm.io/gorm@v1.20.10/schema/field.gofunc (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {

var err error

field := &Field{

Name: fieldStruct.Name,

BindNames: []string{fieldStruct.Name},

FieldType: fieldStruct.Type,

IndirectFieldType: fieldStruct.Type,

StructField: fieldStruct,

Creatable: true,

Updatable: true,

Readable: true,

Tag: fieldStruct.Tag,

TagSettings: ParseTagSetting(fieldStruct.Tag.Get("gorm"), ";"),

Schema: schema,

AutoIncrementIncrement: 1,

}

for field.IndirectFieldType.Kind() == reflect.Ptr {

field.IndirectFieldType = field.IndirectFieldType.Elem()

}

fieldValue := reflect.New(field.IndirectFieldType)

// if field is valuer, used its value or first fields as data type

valuer, isValuer := fieldValue.Interface().(driver.Valuer)

//......

field.GORMDataType = field.DataType

if dataTyper, ok := fieldValue.Interface().(GormDataTypeInterface); ok {

field.DataType = DataType(dataTyper.GormDataType())

}

if v, ok := field.TagSettings["AUTOCREATETIME"]; ok || (field.Name == "CreatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) {

if strings.ToUpper(v) == "NANO" {

field.AutoCreateTime = UnixNanosecond

} else if strings.ToUpper(v) == "MILLI" {

field.AutoCreateTime = UnixMillisecond

} else {

field.AutoCreateTime = UnixSecond

}

}

if v, ok := field.TagSettings["AUTOUPDATETIME"]; ok || (field.Name == "UpdatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) {

if strings.ToUpper(v) == "NANO" {

field.AutoUpdateTime = UnixNanosecond

} else if strings.ToUpper(v) == "MILLI" {

field.AutoUpdateTime = UnixMillisecond

} else {

field.AutoUpdateTime = UnixSecond

}

}

//......

return field

}ParseField方法會(huì)解析field的屬性,如果field的name為CreatedAt或者UpdatedAt,且dataType為Time、Int、Unit或者tag標(biāo)注了AUTOCREATETIME或者AUTOUPDATETIME,則會(huì)設(shè)置field.AutoCreateTime或者field.AutoUpdateTime

TimeType

gorm.io/gorm@v1.20.10/schema/field.gotype TimeType int64

const (

UnixSecond TimeType = 1

UnixMillisecond TimeType = 2

UnixNanosecond TimeType = 3

)field.AutoCreateTime、AutoUpdateTime屬性為TimeType類型,該類型有UnixSecond、UnixMillisecond、UnixNanosecond三種類型

ConvertToCreateValues

gorm.io/gorm@v1.20.10/callbacks/create.go// ConvertToCreateValues convert to create values

func ConvertToCreateValues(stmt *gorm.Statement) (values clause.Values) {

switch value := stmt.Dest.(type) {

case map[string]interface{}:

values = ConvertMapToValuesForCreate(stmt, value)

case *map[string]interface{}:

values = ConvertMapToValuesForCreate(stmt, *value)

case []map[string]interface{}:

values = ConvertSliceOfMapToValuesForCreate(stmt, value)

case *[]map[string]interface{}:

values = ConvertSliceOfMapToValuesForCreate(stmt, *value)

default:

var (

selectColumns, restricted = stmt.SelectAndOmitColumns(true, false)

curTime = stmt.DB.NowFunc()

isZero bool

)

values = clause.Values{Columns: make([]clause.Column, 0, len(stmt.Schema.DBNames))}

for _, db := range stmt.Schema.DBNames {

if field := stmt.Schema.FieldsByDBName[db]; !field.HasDefaultValue || field.DefaultValueInterface != nil {

if v, ok := selectColumns[db]; (ok && v) || (!ok && (!restricted || field.AutoCreateTime > 0 || field.AutoUpdateTime > 0)) {

values.Columns = append(values.Columns, clause.Column{Name: db})

}

}

}

switch stmt.ReflectValue.Kind() {

case reflect.Slice, reflect.Array:

stmt.SQL.Grow(stmt.ReflectValue.Len() * 18)

values.Values = make([][]interface{}, stmt.ReflectValue.Len())

defaultValueFieldsHavingValue := map[*schema.Field][]interface{}{}

if stmt.ReflectValue.Len() == 0 {

stmt.AddError(gorm.ErrEmptySlice)

return

}

for i := 0; i < stmt.ReflectValue.Len(); i++ {

rv := reflect.Indirect(stmt.ReflectValue.Index(i))

if !rv.IsValid() {

stmt.AddError(fmt.Errorf("slice data #%v is invalid: %w", i, gorm.ErrInvalidData))

return

}

values.Values[i] = make([]interface{}, len(values.Columns))

for idx, column := range values.Columns {

field := stmt.Schema.FieldsByDBName[column.Name]

if values.Values[i][idx], isZero = field.ValueOf(rv); isZero {

if field.DefaultValueInterface != nil {

values.Values[i][idx] = field.DefaultValueInterface

field.Set(rv, field.DefaultValueInterface)

} else if field.AutoCreateTime > 0 || field.AutoUpdateTime > 0 {

field.Set(rv, curTime)

values.Values[i][idx], _ = field.ValueOf(rv)

}

} else if field.AutoUpdateTime > 0 {

if _, ok := stmt.DB.InstanceGet("gorm:update_track_time"); ok {

field.Set(rv, curTime)

values.Values[0][idx], _ = field.ValueOf(rv)

}

}

}

for _, field := range stmt.Schema.FieldsWithDefaultDBValue {

if v, ok := selectColumns[field.DBName]; (ok && v) || (!ok && !restricted) {

if v, isZero := field.ValueOf(rv); !isZero {

if len(defaultValueFieldsHavingValue[field]) == 0 {

defaultValueFieldsHavingValue[field] = make([]interface{}, stmt.ReflectValue.Len())

}

defaultValueFieldsHavingValue[field][i] = v

}

}

}

}

for field, vs := range defaultValueFieldsHavingValue {

values.Columns = append(values.Columns, clause.Column{Name: field.DBName})

for idx := range values.Values {

if vs[idx] == nil {

values.Values[idx] = append(values.Values[idx], stmt.Dialector.DefaultValueOf(field))

} else {

values.Values[idx] = append(values.Values[idx], vs[idx])

}

}

}

case reflect.Struct:

values.Values = [][]interface{}{make([]interface{}, len(values.Columns))}

for idx, column := range values.Columns {

field := stmt.Schema.FieldsByDBName[column.Name]

if values.Values[0][idx], isZero = field.ValueOf(stmt.ReflectValue); isZero {

if field.DefaultValueInterface != nil {

values.Values[0][idx] = field.DefaultValueInterface

field.Set(stmt.ReflectValue, field.DefaultValueInterface)

} else if field.AutoCreateTime > 0 || field.AutoUpdateTime > 0 {

field.Set(stmt.ReflectValue, curTime)

values.Values[0][idx], _ = field.ValueOf(stmt.ReflectValue)

}

}

}

for _, field := range stmt.Schema.FieldsWithDefaultDBValue {

if v, ok := selectColumns[field.DBName]; (ok && v) || (!ok && !restricted) {

if v, isZero := field.ValueOf(stmt.ReflectValue); !isZero {

values.Columns = append(values.Columns, clause.Column{Name: field.DBName})

values.Values[0] = append(values.Values[0], v)

}

}

}

default:

stmt.AddError(gorm.ErrInvalidData)

}

}

if c, ok := stmt.Clauses["ON CONFLICT"]; ok {

if onConflict, _ := c.Expression.(clause.OnConflict); onConflict.UpdateAll {

if stmt.Schema != nil && len(values.Columns) > 1 {

columns := make([]string, 0, len(values.Columns)-1)

for _, column := range values.Columns {

if field := stmt.Schema.LookUpField(column.Name); field != nil {

if !field.PrimaryKey && (!field.HasDefaultValue || field.DefaultValueInterface != nil) && field.AutoCreateTime == 0 {

columns = append(columns, column.Name)

}

}

}

onConflict := clause.OnConflict{

Columns: make([]clause.Column, len(stmt.Schema.PrimaryFieldDBNames)),

DoUpdates: clause.AssignmentColumns(columns),

}

for idx, field := range stmt.Schema.PrimaryFields {

onConflict.Columns[idx] = clause.Column{Name: field.DBName}

}

stmt.AddClause(onConflict)

}

}

}

return values

}ConvertToCreateValues從stmt.DB.NowFunc()獲取curTime,然后對(duì)于field.AutoCreateTime或者field.AutoUpdateTime大于0的,會(huì)設(shè)置curTime

setupValuerAndSetter

gorm.io/gorm@v1.20.10/schema/field.go// create valuer, setter when parse struct

func (field *Field) setupValuerAndSetter() {

//......

// Set

switch field.FieldType.Kind() {

case reflect.Bool:

field.Set = func(value reflect.Value, v interface{}) error {

switch data := v.(type) {

case bool:

field.ReflectValueOf(value).SetBool(data)

case *bool:

if data != nil {

field.ReflectValueOf(value).SetBool(*data)

} else {

field.ReflectValueOf(value).SetBool(false)

}

case int64:

if data > 0 {

field.ReflectValueOf(value).SetBool(true)

} else {

field.ReflectValueOf(value).SetBool(false)

}

case string:

b, _ := strconv.ParseBool(data)

field.ReflectValueOf(value).SetBool(b)

default:

return fallbackSetter(value, v, field.Set)

}

return nil

}

case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:

field.Set = func(value reflect.Value, v interface{}) (err error) {

switch data := v.(type) {

case int64:

field.ReflectValueOf(value).SetInt(data)

case int:

field.ReflectValueOf(value).SetInt(int64(data))

case int8:

field.ReflectValueOf(value).SetInt(int64(data))

case int16:

field.ReflectValueOf(value).SetInt(int64(data))

case int32:

field.ReflectValueOf(value).SetInt(int64(data))

case uint:

field.ReflectValueOf(value).SetInt(int64(data))

case uint8:

field.ReflectValueOf(value).SetInt(int64(data))

case uint16:

field.ReflectValueOf(value).SetInt(int64(data))

case uint32:

field.ReflectValueOf(value).SetInt(int64(data))

case uint64:

field.ReflectValueOf(value).SetInt(int64(data))

case float32:

field.ReflectValueOf(value).SetInt(int64(data))

case float64:

field.ReflectValueOf(value).SetInt(int64(data))

case []byte:

return field.Set(value, string(data))

case string:

if i, err := strconv.ParseInt(data, 0, 64); err == nil {

field.ReflectValueOf(value).SetInt(i)

} else {

return err

}

case time.Time:

if field.AutoCreateTime == UnixNanosecond || field.AutoUpdateTime == UnixNanosecond {

field.ReflectValueOf(value).SetInt(data.UnixNano())

} else if field.AutoCreateTime == UnixMillisecond || field.AutoUpdateTime == UnixMillisecond {

field.ReflectValueOf(value).SetInt(data.UnixNano() / 1e6)

} else {

field.ReflectValueOf(value).SetInt(data.Unix())

}

case *time.Time:

if data != nil {

if field.AutoCreateTime == UnixNanosecond || field.AutoUpdateTime == UnixNanosecond {

field.ReflectValueOf(value).SetInt(data.UnixNano())

} else if field.AutoCreateTime == UnixMillisecond || field.AutoUpdateTime == UnixMillisecond {

field.ReflectValueOf(value).SetInt(data.UnixNano() / 1e6)

} else {

field.ReflectValueOf(value).SetInt(data.Unix())

}

} else {

field.ReflectValueOf(value).SetInt(0)

}

default:

return fallbackSetter(value, v, field.Set)

}

return err

}

case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:

field.Set = func(value reflect.Value, v interface{}) (err error) {

switch data := v.(type) {

case uint64:

field.ReflectValueOf(value).SetUint(data)

case uint:

field.ReflectValueOf(value).SetUint(uint64(data))

case uint8:

field.ReflectValueOf(value).SetUint(uint64(data))

case uint16:

field.ReflectValueOf(value).SetUint(uint64(data))

case uint32:

field.ReflectValueOf(value).SetUint(uint64(data))

case int64:

field.ReflectValueOf(value).SetUint(uint64(data))

case int:

field.ReflectValueOf(value).SetUint(uint64(data))

case int8:

field.ReflectValueOf(value).SetUint(uint64(data))

case int16:

field.ReflectValueOf(value).SetUint(uint64(data))

case int32:

field.ReflectValueOf(value).SetUint(uint64(data))

case float32:

field.ReflectValueOf(value).SetUint(uint64(data))

case float64:

field.ReflectValueOf(value).SetUint(uint64(data))

case []byte:

return field.Set(value, string(data))

case time.Time:

if field.AutoCreateTime == UnixNanosecond || field.AutoUpdateTime == UnixNanosecond {

field.ReflectValueOf(value).SetUint(uint64(data.UnixNano()))

} else if field.AutoCreateTime == UnixMillisecond || field.AutoUpdateTime == UnixMillisecond {

field.ReflectValueOf(value).SetUint(uint64(data.UnixNano() / 1e6))

} else {

field.ReflectValueOf(value).SetUint(uint64(data.Unix()))

}

case string:

if i, err := strconv.ParseUint(data, 0, 64); err == nil {

field.ReflectValueOf(value).SetUint(i)

} else {

return err

}

default:

return fallbackSetter(value, v, field.Set)

}

return err

}

case reflect.Float32, reflect.Float64:

field.Set = func(value reflect.Value, v interface{}) (err error) {

switch data := v.(type) {

case float64:

field.ReflectValueOf(value).SetFloat(data)

case float32:

field.ReflectValueOf(value).SetFloat(float64(data))

case int64:

field.ReflectValueOf(value).SetFloat(float64(data))

case int:

field.ReflectValueOf(value).SetFloat(float64(data))

case int8:

field.ReflectValueOf(value).SetFloat(float64(data))

case int16:

field.ReflectValueOf(value).SetFloat(float64(data))

case int32:

field.ReflectValueOf(value).SetFloat(float64(data))

case uint:

field.ReflectValueOf(value).SetFloat(float64(data))

case uint8:

field.ReflectValueOf(value).SetFloat(float64(data))

case uint16:

field.ReflectValueOf(value).SetFloat(float64(data))

case uint32:

field.ReflectValueOf(value).SetFloat(float64(data))

case uint64:

field.ReflectValueOf(value).SetFloat(float64(data))

case []byte:

return field.Set(value, string(data))

case string:

if i, err := strconv.ParseFloat(data, 64); err == nil {

field.ReflectValueOf(value).SetFloat(i)

} else {

return err

}

default:

return fallbackSetter(value, v, field.Set)

}

return err

}

case reflect.String:

field.Set = func(value reflect.Value, v interface{}) (err error) {

switch data := v.(type) {

case string:

field.ReflectValueOf(value).SetString(data)

case []byte:

field.ReflectValueOf(value).SetString(string(data))

case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:

field.ReflectValueOf(value).SetString(utils.ToString(data))

case float64, float32:

field.ReflectValueOf(value).SetString(fmt.Sprintf("%."+strconv.Itoa(field.Precision)+"f", data))

default:

return fallbackSetter(value, v, field.Set)

}

return err

}

default:

fieldValue := reflect.New(field.FieldType)

switch fieldValue.Elem().Interface().(type) {

case time.Time:

field.Set = func(value reflect.Value, v interface{}) error {

switch data := v.(type) {

case time.Time:

field.ReflectValueOf(value).Set(reflect.ValueOf(v))

case *time.Time:

if data != nil {

field.ReflectValueOf(value).Set(reflect.ValueOf(data).Elem())

} else {

field.ReflectValueOf(value).Set(reflect.ValueOf(time.Time{}))

}

case string:

if t, err := now.Parse(data); err == nil {

field.ReflectValueOf(value).Set(reflect.ValueOf(t))

} else {

return fmt.Errorf("failed to set string %v to time.Time field %v, failed to parse it as time, got error %v", v, field.Name, err)

}

default:

return fallbackSetter(value, v, field.Set)

}

return nil

}

case *time.Time:

field.Set = func(value reflect.Value, v interface{}) error {

switch data := v.(type) {

case time.Time:

fieldValue := field.ReflectValueOf(value)

if fieldValue.IsNil() {

fieldValue.Set(reflect.New(field.FieldType.Elem()))

}

fieldValue.Elem().Set(reflect.ValueOf(v))

case *time.Time:

field.ReflectValueOf(value).Set(reflect.ValueOf(v))

case string:

if t, err := now.Parse(data); err == nil {

fieldValue := field.ReflectValueOf(value)

if fieldValue.IsNil() {

if v == "" {

return nil

}

fieldValue.Set(reflect.New(field.FieldType.Elem()))

}

fieldValue.Elem().Set(reflect.ValueOf(t))

} else {

return fmt.Errorf("failed to set string %v to time.Time field %v, failed to parse it as time, got error %v", v, field.Name, err)

}

default:

return fallbackSetter(value, v, field.Set)

}

return nil

}

default:

if _, ok := fieldValue.Elem().Interface().(sql.Scanner); ok {

// pointer scanner

field.Set = func(value reflect.Value, v interface{}) (err error) {

reflectV := reflect.ValueOf(v)

if !reflectV.IsValid() {

field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem())

} else if reflectV.Type().AssignableTo(field.FieldType) {

field.ReflectValueOf(value).Set(reflectV)

} else if reflectV.Kind() == reflect.Ptr {

if reflectV.IsNil() || !reflectV.IsValid() {

field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem())

} else {

return field.Set(value, reflectV.Elem().Interface())

}

} else {

fieldValue := field.ReflectValueOf(value)

if fieldValue.IsNil() {

fieldValue.Set(reflect.New(field.FieldType.Elem()))

}

if valuer, ok := v.(driver.Valuer); ok {

v, _ = valuer.Value()

}

err = fieldValue.Interface().(sql.Scanner).Scan(v)

}

return

}

} else if _, ok := fieldValue.Interface().(sql.Scanner); ok {

// struct scanner

field.Set = func(value reflect.Value, v interface{}) (err error) {

reflectV := reflect.ValueOf(v)

if !reflectV.IsValid() {

field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem())

} else if reflectV.Type().AssignableTo(field.FieldType) {

field.ReflectValueOf(value).Set(reflectV)

} else if reflectV.Kind() == reflect.Ptr {

if reflectV.IsNil() || !reflectV.IsValid() {

field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem())

} else {

return field.Set(value, reflectV.Elem().Interface())

}

} else {

if valuer, ok := v.(driver.Valuer); ok {

v, _ = valuer.Value()

}

err = field.ReflectValueOf(value).Addr().Interface().(sql.Scanner).Scan(v)

}

return

}

} else {

field.Set = func(value reflect.Value, v interface{}) (err error) {

return fallbackSetter(value, v, field.Set)

}

}

}

}

}setupValuerAndSetter方法針對(duì)time.Time或*time.Time類型的setter會(huì)根據(jù)TimeType再做時(shí)間精度處理

實(shí)例type Product struct {

gorm.Model

Code string

Price uint

}Product內(nèi)嵌了gorm.Model,內(nèi)置了ID、CreatedAt、UpdatedAt、DeletedAt屬性,同時(shí)Create的時(shí)候會(huì)自動(dòng)設(shè)置CreatedAt、UpdatedAt,Update的時(shí)候會(huì)自動(dòng)更新UpdatedAt

小結(jié)

gorm定義了ID、CreatedAt、UpdatedAt、DeletedAt屬性;其中Create的時(shí)候會(huì)自動(dòng)設(shè)置CreatedAt、UpdatedAt,Update的時(shí)候會(huì)自動(dòng)更新UpdatedAt;CreatedAt、UpdatedAt支持 UnixSecond、UnixMillisecond、UnixNanosecond三種時(shí)間精度。

doc查看原文

與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的beego mysql 存储过程_ioioj5的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。