在Golang中,为PostgreSQL数据库的枚举类型值进行JSON绑定。

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

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 必须实现 ScannerValuer 接口。

看一下 std 包是如何为 NullString 实现的

// 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
}

huangapple
  • 本文由 发表于 2016年8月19日 13:31:16
  • 转载请务必保留本文链接:https://go.coder-hub.com/39031715.html
匿名

发表评论

匿名网友

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

确定