You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Golang sqlc中将pgtype.Text转为string(含可为空字段)

问题

我用sqlc生成SQL查询对应的Go代码,SQL语句如下:

INSERT INTO "users" (
    username,
    name,
    surname,
    email,
    hashed_password,
    role
) VALUES (
    $1, $2, $3, $4, $5, $6
) RETURNING "id", "username";

生成的结构体为:

type CreateUserParams struct {
    Username       string      `json:"username"`
    Name           pgtype.Text `json:"name"`
    Surname        pgtype.Text `json:"surname"`
    Email          string      `json:"email"`
    HashedPassword string      `json:"hashed_password"`
    Role           UserRole    `json:"role"`
}

users表的name和surname字段允许为NULL,表结构如下:

CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    username VARCHAR(50) UNIQUE NOT NULL,
    name VARCHAR(100),
    surname VARCHAR(100),
    email VARCHAR(150) UNIQUE NOT NULL CHECK (email ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$'),
    hashed_password VARCHAR(1024) NOT NULL,
    role user_role NOT NULL DEFAULT 'USER',
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

sqlc生成了pgtype.Text类型,但我希望把这两个字段改成Go原生的string类型。当前我的sqlc.yaml配置如下:

version: "2"
sql:
  - schema: "db/migrations/users"
    queries: "db/queries"
    engine: "postgresql"
    gen:
      go:
        package: "internal"
        out: "db/internal/"
        sql_package: "pgx/v5"
        output_files_suffix: "_gen"
        emit_json_tags: true
        emit_interface: true
        emit_empty_slices: true
        overrides:
          - db_type: "timestamptz"
            go_type: "time.Time"
          - db_type: "uuid"
            go_type: "github.com/google/uuid.UUID"
          - db_type: "text"
            go_type:
              type: "string"

请问怎么把这两个字段转为string类型?

解决方案

你当前的配置只覆盖了text类型,但name和surname是VARCHAR(100)类型,需要针对varchar类型添加覆盖规则,才能让sqlc将可空的varchar字段映射为Go原生string。

修改sqlc.yaml中的overrides部分,添加varchar类型的覆盖规则:

overrides:
  - db_type: "timestamptz"
    go_type: "time.Time"
  - db_type: "uuid"
    go_type: "github.com/google/uuid.UUID"
  - db_type: "text"
    go_type:
      type: "string"
  # 添加通用varchar类型的覆盖
  - db_type: "varchar"
    go_type:
      type: "string"
    nullable: true
  # 也可以精确匹配指定长度的varchar,比如对应表中的varchar(100)
  - db_type: "varchar(100)"
    go_type:
      type: "string"
    nullable: true

其中nullable: true用于明确告诉sqlc该数据库字段允许为NULL,生成Go代码时会自动处理空字符串与数据库NULL值的映射。

修改完成后,重新运行sqlc生成代码,CreateUserParams中的Name和Surname字段就会变为string类型。

内容的提问来源于stack exchange,提问作者Mayukh Sarkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:33:40