【发布时间】:2022-10-15 22:07:31
【问题描述】:
有什么方法可以结合 JSON 验证 [github.com/go-playground/validator/v10] 和 JSON 查询 [sqlc] 而无需创建两个不同的结构?
我有下表定义
CREATE TABLE table1 (
columnName1 VARCHAR(200) NOT NULL PRIMARY KEY,
columnName2 VARCHAR(200) NOT NULL
)
以及以下查询
-- name: GetTable1:one
SELECT * FROM table1
WHERE columnName1 = $1 LIMIT 1;
执行 SQLC 生成以下代码
...
//
// This struct is created automatically by sqlC
//
type CreateTable1Params struct {
Columnname1 string `json:"columnname1"`
Columnname2 string `json:"columnname2"`
}
func (q *Queries) CreateTable1(ctx context.Context, arg CreateTable1Params ) (Table1, error) {
...
}
现在,我需要验证 CreateTable1 的 REST 参数,假设 columnName2 是必需的,所以我有一个控制器包,如下所示
table1Controller.go
import (
...
validator "github.com/go-playground/validator/v10"
)
type Table1Controller struct {
Validate *validator.Validate
}
//
// This struct is created manually for validation
//
type InT1Param struct {
ColumnName1 string `validate:"required" form:"columnName1" json:"columnName1" db:"columnname1"`
ColumnName2 string `validate:"required" form:"columnName2" json:"columnName2" db:"columnname2" binding="required"`
}
func (c *Table1Controller) validateInput(t1 InT1Param) error {
err := service.Validate.Struct(t1)
if err != nil {
errStr := ""
for _, mapErr := range err.(validator.ValidationErrors) {
errStr = fmt.Sprintf("%s%s\n", errStr, mapErr.Translate(service.Translator))
}
return errors.New(errStr)
}
return nil
}
func (c *Table1Controller) Insert(ctx *gin.Context, dbQueries *dbModel.Queries, t1 InT1Param) error {
err := c.validateInput(t1)
if err != nil {
return err
inParam = dbModel.CreateTable1Param {
Columnname1: t1.columnName1,
Columnname2: t2.ColumnName2
}
outParam, err := dbQueries.CreateTable1(ctx, inParam)
if err != nil {
return err
return nil
}
【问题讨论】:
-
你的问题不清楚
-
您可以通过config file 添加结构标签,请参阅this issue 了解更多信息。
-
感谢Brits 线索,我能够添加我需要的 JSON 验证标签。