如何用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"
关键说明
- 系统类型名称:PostgreSQL的
INT对应系统内部类型是pg_catalog.int4,必须使用带pg_catalog前缀的名称才能匹配全局类型规则,直接用int或int4无法生效。 - 可空属性匹配:由于你的列未声明
NOT NULL,属于可空列,sqlc会区分可空与非空类型的映射规则,只有添加nullable: true才能匹配所有可空的int4列。 - 非空列场景:如果所有
INT列都添加了NOT NULL约束,可去掉nullable: true配置,直接使用db_type: "pg_catalog.int4"即可。
生成效果
重新执行sqlc生成命令后,结构体将变为:
package sql type Weather struct { Temperature int }
内容的提问来源于stack exchange,提问作者0xBradock
相关产品推荐
相关产品推荐

