gpt4 book ai didi

sql - 使用 sql null 类型去验证器?

转载 作者:IT王子 更新时间:2023-10-29 02:08:30 27 4
gpt4 key购买 nike

我在让 golang 验证器处理 SQL 空类型时遇到问题。这是我尝试过的示例:

package main

import (
"database/sql"
"database/sql/driver"
"log"

"gopkg.in/go-playground/validator.v9"
)

// NullInt64
type NullInt64 struct {
sql.NullInt64
Set bool
}

func MakeNullInt64(valid bool, val int64) NullInt64 {
n := NullInt64{}
n.Set = true
n.Valid = valid
if valid {
n.Int64 = val
}
return n
}
func (n *NullInt64) Value() (driver.Value, error) {
if !n.NullInt64.Valid {
return nil, nil
}
return n.NullInt64.Int64, nil
}

type Thing struct {
N2 NullInt64 `validate:"min=10"`
N3 int64 `validate:"min=10"`
N4 *int64 `validate:"min=10"`
}

func main() {
validate := validator.New()

n := int64(6)
number := MakeNullInt64(true, n)
thing := Thing{number, n, &n}
e := validate.Struct(thing)

log.Println(e)
}

当我运行这段代码时,我只得到这个输出:

Key: 'Thing.N3' Error:Field validation for 'N3' failed on the 'min' tag

Key: 'Thing.N4' Error:Field validation for 'N4' failed on the 'min' tag

问题是我希望它也显示 Thing.N2 失败的原因与 Thing.N3Thing.N4.

我尝试引入 func (n *NullInt64) Value() 方法,因为它在 documentation 中被提及.但我想我误解了一些东西。谁能告诉我我做错了什么?

最佳答案

更新

有一个Example专门为此。你可以检查一下。不过,我提出的其他解决方案应该仍然有效。


由于您尝试验证的值是 sql.NullInt64 中的 Int64,因此最简单的方法是删除 validate 标记并只需注册一个Struct Level验证使用:

validate.RegisterStructValidation(NullInt64StructLevelValidation, NullInt64{})

虽然 NullInt64StructLevelValidation 是一个 StructLevelFunc,如下所示:

func NullInt64StructLevelValidation(sl validator.StructLevel) {
ni := sl.Current().Interface().(NullInt64)
if ni.NullInt64.Int64 < 10 {
sl.ReportError(ni.NullInt64.Int64, "Int64", "", "min", "")
}
}

注意 #1:这一行 thing := Thing{number,&number,n,&n} 有一个参数太多了。我假设你的意思是 thing := Thing{number, n, &n}

注释 #2:Go 工具包括 gofmt被认为是该语言最强大的功能之一。请考虑使用它/them .

编辑#1:我认为实现 Valuer 接口(interface)在这种情况下没有任何值(value)。

关于sql - 使用 sql null 类型去验证器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53039386/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com