英文:
Json binding for enum type values in golang for postgres database
问题
我正在实现一个 REST API,其中我发送一个 JSON 请求体。
type Service struct {
id int64 `db:"id" json:"id"`
Name string `form:"name" db:"name" json:"name" binding:"required"`
Servicetype string `form:"type" db:"type" json:"type" binding:"required"`
}
func myHandler(c *gin.Context) {
if c.BindJSON(&json) == nil {
fmt.Println(json.Servicetype)
} else {
fmt.Println("json binding error")
}
}
在我的数据库中,Servicetype
是一个枚举类型。我该如何在 Service
结构体中进行绑定?我能够绑定 Name
字段,因为它在数据库中是 VARCHAR 类型。但是当我添加 Servicetype
到结构体中时,绑定失败。我正在使用 PostgreSQL 作为我的数据库。
英文:
I am implementing a rest api where I send a json request body.
type Service struct {
id int64 `db:"id" json:"id"`
Name string `form:"name" db:"name" json:"name" binding:"required"`
Servicetype string `form:"type" db:"type" json:"type" binding:"required"`
}
func myHandler(c *gin.Context) {
if c.BindJSON(&json) == nil {
fmt.Println(json.Servicetype)
} else {
fmt.Println("json binding error")
}
}
Servicetype is of type enum in my database. How can I have binding for that in my Service struct? I am able to bind the Name
field as it is of type VARCHAR in database. But it fails to bind when I add Servicetype
in the struct. I am using postgres as my database.
答案1
得分: 2
Servicetype 必须实现 Scanner 和 Valuer 接口。
// NullString 表示可能为 null 的字符串。
// NullString 实现了 Scanner 接口,因此
// 它可以用作扫描目标:
type NullString struct {
String string
Valid bool // 如果 String 不为 NULL,则 Valid 为 true
}
// Scan 实现了 Scanner 接口。
func (ns *NullString) Scan(value interface{}) error {
if value == nil {
ns.String, ns.Valid = "", false
return nil
}
ns.Valid = true
return convertAssign(&ns.String, value)
}
// Value 实现了 driver Valuer 接口。
func (ns NullString) Value() (driver.Value, error) {
if !ns.Valid {
return nil, nil
}
return ns.String, nil
}
英文:
Servicetype must implement Scanner and Valuer interfaces.
Take a look on how std package does it for NullString
// NullString represents a string that may be null.
// NullString implements the Scanner interface so
// it can be used as a scan destination:
type NullString struct {
String string
Valid bool // Valid is true if String is not NULL
}
// Scan implements the Scanner interface.
func (ns *NullString) Scan(value interface{}) error {
if value == nil {
ns.String, ns.Valid = "", false
return nil
}
ns.Valid = true
return convertAssign(&ns.String, value)
}
// Value implements the driver Valuer interface.
func (ns NullString) Value() (driver.Value, error) {
if !ns.Valid {
return nil, nil
}
return ns.String, nil
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论