Gorm获取列名

huangapple go评论82阅读模式
英文:

Gorm get column name

问题

我在gorm中有以下模型:

type Person struct {
	ID        uuid.UUID      `gorm:"type:uuid;default:uuid_generate_v4()"`
	Name      string         `gorm:"not null,type:text"`
	CreatedAt time.Time      `gorm:"autoCreateTime"`
	UpdatedAt time.Time      `gorm:"autoUpdateTime"`
	DeletedAt gorm.DeletedAt `gorm:"index->"`
}

是否可以获取列名?我想要gorm将生成的列名。

英文:

I have the following model in gorm

type Person struct {
	ID        uuid.UUID      `gorm:"type:uuid;default:uuid_generate_v4()"`
	Name      string         `gorm:"not null,type:text"`
	CreatedAt time.Time      `gorm:"autoCreateTime"`
	UpdatedAt time.Time      `gorm:"autoUpdateTime"`
	DeletedAt gorm.DeletedAt `gorm:"index,->"`
}

Is it possible to get the column name? I want the column name that gorm will generate

答案1

得分: 5

可能的解决方案

解决方案是从模型中检索("解析")模式。
请注意:是从模型中检索,而不是从"物理"数据库中检索。

参考资料

草稿示例程序

go.mod

module gorm/example

go 1.18

require (
    github.com/google/uuid v1.3.0
    gorm.io/gorm v1.23.8
)

require (
    github.com/jinzhu/inflection v1.0.0 // indirect
    github.com/jinzhu/now v1.1.4 // indirect
)

go.sum

github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas=
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
gorm.io/gorm v1.23.8 h1:h8sGJ+biDgBA1AD1Ha9gFCx7h8npU7AsLdlkX0n2TpE=
gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=

程序 (main.go)

package main

import (
    "fmt"
    "github.com/google/uuid"
    "gorm.io/gorm"
    "gorm.io/gorm/schema"
    "sync"
    "time"
)

type Person struct {
    ID        uuid.UUID      `gorm:"type:uuid;default:uuid_generate_v4()"`
    Name      string         `gorm:"not null,type:text"`
    CreatedAt time.Time      `gorm:"autoCreateTime"`
    UpdatedAt time.Time      `gorm:"autoUpdateTime"`
    DeletedAt gorm.DeletedAt `gorm:"index->"`
}

func main() {
    s, err := schema.Parse(&Person{}, &sync.Map{}, schema.NamingStrategy{})
    if err != nil {
        panic("failed to parse schema")
    }

    m := make(map[string]string)
    for _, field := range s.Fields {
        dbName := field.DBName
        modelName := field.Name
        m[modelName] = dbName
    }

    fmt.Println("Model to schema field name map:", m)
    fmt.Println("CreatedAt field is mapped to", m["CreatedAt"], "column")
}

构建

$ go build main.go

运行

$ ./main

输出

Model to schema field name map: map[CreatedAt:created_at DeletedAt:deleted_at ID:id Name:name UpdatedAt:updated_at]
CreatedAt field is mapped to created_at column
英文:

Possible solution

The solution is to retrieve («parse») the schema from the model.
Please, note: from the model — not from a «physical» database.

References

Draft example program

go.mod

module gorm/example

go 1.18

require (
	github.com/google/uuid v1.3.0
	gorm.io/gorm v1.23.8
)

require (
	github.com/jinzhu/inflection v1.0.0 // indirect
	github.com/jinzhu/now v1.1.4 // indirect
)

go.sum

github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas=
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
gorm.io/gorm v1.23.8 h1:h8sGJ+biDgBA1AD1Ha9gFCx7h8npU7AsLdlkX0n2TpE=
gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=

Program (main.go)

package main

import (
    "fmt"
    "github.com/google/uuid"
    "gorm.io/gorm"
    "gorm.io/gorm/schema"
    "sync"
    "time"
)

type Person struct {
    ID        uuid.UUID      `gorm:"type:uuid;default:uuid_generate_v4()"`
    Name      string         `gorm:"not null,type:text"`
    CreatedAt time.Time      `gorm:"autoCreateTime"`
    UpdatedAt time.Time      `gorm:"autoUpdateTime"`
    DeletedAt gorm.DeletedAt `gorm:"index,->"`
}

func main() {
    s, err := schema.Parse(&Person{}, &sync.Map{}, schema.NamingStrategy{})
    if err != nil {
        panic("failed to parse schema")
    }

    m := make(map[string]string)
    for _, field := range s.Fields {
        dbName := field.DBName
        modelName := field.Name
        m[modelName] = dbName
    }

    fmt.Println("Model to schema field name map:", m)
    fmt.Println("CreatedAt field is mapped to", m["CreatedAt"], "column")
}

Build

$ go build main.go

Run

$ ./main

Output

Model to schema field name map: map[CreatedAt:created_at DeletedAt:deleted_at ID:id Name:name UpdatedAt:updated_at]
CreatedAt field is mapped to created_at column

答案2

得分: 1

使用标签的方式如下:

> gorm:"column:uid"

type UserInfo struct {
	Uid       int       `json:"uid" gorm:"column:uid" form:"uid"` 
	Uname     string    `json:"uname" gorm:"column:uname" form:"uname"`
}
英文:

use tag like this:

> gorm:"column:uid"

type UserInfo struct {
Uid       int       `json:"uid" gorm:"column:uid" form:"uid"` 
Uname     string    `json:"uname" gorm:"column:uname" form:"uname"`
}

huangapple
  • 本文由 发表于 2022年7月17日 05:40:57
  • 转载请务必保留本文链接:https://go.coder-hub.com/73007826.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定