【问题标题】:Golang how to use Validator with SqlCGolang 如何使用 Validator 和 SqlC
【发布时间】: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 验证标签。

标签: go sqlc


【解决方案1】:

使用 sqlc.yaml 配置的 overrides 键,我能够将以下字段添加到列中。

version: 2
sql:
  - schema: "./dbModel/migration/schema_20221008.sql"
    queries: "./dbModel/query/query.sql"
    engine: "postgresql"
    gen:
      go:
        package: "dbModel"
        out: "dbModel"
        emit_json_tags: true
        emit_db_tags: true
        emit_prepared_queries: false
        emit_interface: false
        emit_exact_table_names: false
        json_tags_case_style: camel
        overrides:
          - column: table1.column_name1
            go_struct_tag: validate:"required" x:"y,z"
          - column: table1.column_name2
            go_struct_tag: validate:"required"

此配置为表生成以下结构:

type table1 struct {
    ColumnName1 string `db:"column_name1" json:"columnName1" validate:"required" x:"y,z"`
    ColumnName2 string `db:"column_name2" json:"columnName2" validate:"required"`

我无法更改 Param 结构,但我猜想使用 table main 结构使用验证。

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2017-06-12
    相关资源
    最近更新 更多