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

如何用sqlc全局覆盖pgtype.Int4为Go原生int类型?

全局替换sqlc生成的pgtype.Int4为Go原生int

默认情况下,sqlc会将PostgreSQL的INT列类型转换为Go结构体中的pgtype.Int4类型。

例如建表语句:

CREATE TABLE weathers (
    temperature INT, 
);

sqlc生成的Go代码为:

package sql

import (
    "github.com/jackc/pgx/v5/pgtype"
)

type Weather struct {
    Temperature pgtype.Int4
}

需求是将所有integer类型列全局替换为Go原生int,而非单个列配置,但尝试多种db_type配置均无效,仅指定单个列的配置生效。


正确配置方案

在sqlc.yaml中,针对PostgreSQL系统类型pg_catalog.int4添加全局覆盖规则,必须指定nullable: true(因为PostgreSQL的INT默认允许为空):

version: "2"
sql:
  - name: "sql"
    engine: "postgresql"
    queries: "query"
    schema: "migrate"
    gen:
      go:
        package: "sql"
        out: "sqlc"
        sql_package: "pgx/v5"
        overrides:
          - db_type: "pg_catalog.int4"
            nullable: true
            go_type:
              type: "int"

关键说明

  1. 系统类型名称:PostgreSQL的INT对应系统内部类型是pg_catalog.int4,必须使用带pg_catalog前缀的名称才能匹配全局类型规则,直接用int或int4无法生效。
  2. 可空属性匹配:由于你的列未声明NOT NULL,属于可空列,sqlc会区分可空与非空类型的映射规则,只有添加nullable: true才能匹配所有可空的int4列。
  3. 非空列场景:如果所有INT列都添加了NOT NULL约束,可去掉nullable: true配置,直接使用db_type: "pg_catalog.int4"即可。

生成效果

重新执行sqlc生成命令后,结构体将变为:

package sql

type Weather struct {
    Temperature int
}

内容的提问来源于stack exchange,提问作者0xBradock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:05:15