Golang Gin 验证和 SQLC

Goo*_*ies 5 validation json go sqlc

我正在使用 SQLC 根据我的架构和 Gin 生成 Web API 的结构。

在这里查看此主题:Golang how to use Validator with SqlC后,我注意到答案特别指出:

我无法更改 Param 结构,但我猜想使用表主结构来进行验证。

这正是我所追求的行为。我注意到,如果我有一个使用给定表的子集的查询,例如:

-- name: CreateUserBasic :one
INSERT INTO users (
    username, email, phone
) VALUES (
    $1, $2, $3
) RETURNING *;
Run Code Online (Sandbox Code Playgroud)

它产生如下结构:

type CreateUserBasicParams struct {
    Username string      `json:"username"`
    Email    string      `json:"email"`
    Phone    pgtype.Text `json:"phone"`
}
Run Code Online (Sandbox Code Playgroud)

就我而言,我什至包含了用于添加“required”标签的覆盖:

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"
Run Code Online (Sandbox Code Playgroud)

但这仅修改表结构,而不修改任何参数结构:

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"`
}
Run Code Online (Sandbox Code Playgroud)

使用 Gin,我想调用CreateUserBasic接收到的数据,并且 JSON 可以直接 Unmashall-ed 到结构中CreateUserBasicParams,但不幸的是,如果没有 params 结构上的装饰器,在解析过程中允许缺少字段,似乎我需要重新创建一个新结构,其布局与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!",
    })
}
Run Code Online (Sandbox Code Playgroud)

如何最好地将任意验证应用于 SQLC 生成的“Params”结构,而无需重新创建结构或修改标签?

Vig*_*ggi 0

当您使用每列覆盖时,“覆盖”的缩进级别应与 yaml 文件中的版本行匹配。例如:

version: "1"
packages:
  - name: "foo"
    path: "bar"
    . 
    .
    .
overrides:
  - column: "users.username"
    go_struct_tag: validate:"required"
Run Code Online (Sandbox Code Playgroud)

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