Golang Gin Validation and SQLC



我正在使用sql来生成基于我的模式和Gin的web API的结构。

在这里查看了这个主题:学习如何在sql中使用Validator之后,我注意到答案明确地说:

我无法改变参数结构,但我猜使用表

这正是我所追求的行为。我注意到,如果我有一个查询使用给定表的子集,例如:
-- name: CreateUserBasic :one
INSERT INTO users (
username, email, phone
) VALUES (
$1, $2, $3
) RETURNING *;

生成如下结构:

type CreateUserBasicParams struct {
Username string      `json:"username"`
Email    string      `json:"email"`
Phone    pgtype.Text `json:"phone"`
}

在我的例子中,我甚至包括了用于添加"必需的"的覆盖。标记:

version: 2
sql:
- engine: "postgresql"
schema: [
...
]
queries: [
...
]
strict_function_checks: true
gen:
go:
emit_json_tags: true
sql_package: "pgx/v5"
package: "hmdb"
out: "hmdb"
overrides:
- db_type: users.username
go_struct_tag: validate:"required"

但是这只修改了表结构,而不是任何参数结构:

type User struct {
ID             pgtype.UUID        `json:"id"`
Email          string             `json:"email"`
Phone          pgtype.Text        `json:"phone"`
Username       string             `json:"username"`
Password       pgtype.Text        `json:"password"`
MFAToken       pgtype.Text        `json:"mfatoken"`
ActivationID   pgtype.UUID        `json:"activation_id"`
ActivationCode string             `json:"activation_code"`
CreatedAt      pgtype.Timestamptz `json:"created_at"`
ActivatedAt    pgtype.Timestamptz `json:"activated_at"`
Active         bool               `json:"active"`
}

使用Gin,我想用接收到的数据调用CreateUserBasic, JSON可以直接unmash- ed到CreateUserBasicParams结构中,但不幸的是没有参数结构上的装饰器,在解析过程中允许缺少字段,似乎我需要重新创建一个与CreateUserBasicParams结构几乎相同布局的新结构,只有正确的标签:

func (c *Controller) Register(ctx *gin.Context) {
var params hmdb.CreateUserBasicParams
if err := ctx.ShouldBindWith(&params, binding.JSON); err != nil {
ctx.AbortWithError(http.StatusBadRequest, err)
}
log.Printf("Parameters:n%+v", params)
q := hmdb.New(c.DBPool)
u, err := q.CreateUserBasic(ctx, params)
if err != nil {
ctx.AbortWithError(http.StatusBadRequest, err)
}
log.Printf("New User:n%+v", u)
ctx.JSON(http.StatusOK, gin.H{
"message": "Good!",
})
}

我怎样才能最好地对sqlc生成的"参数"应用任意验证?结构,而不重新创建结构或修改标签?

当您使用逐列覆盖时,";"的缩进级别将覆盖";"应该与yaml文件中的版本行匹配。例如:

version: "1"
packages:
- name: "foo"
path: "bar"
. 
.
.
overrides:
- column: "users.username"
go_struct_tag: validate:"required"

文档在这里- https://docs.sqlc.dev/en/stable/reference/config.html?highlight=override#per-column-type-overrides

最新更新