如何配置sqlc生成不含Schema名的Go模型类型名称?
解决sqlc生成模型结构体时包含Schema前缀的问题
问题场景
使用sqlc v1.26.0处理PostgreSQL带Schema的表时,生成的模型结构体名称包含Schema前缀(如GoHtmxTodoTodo),但期望生成简洁的Todo结构体名。此前尝试多种overrides重命名规则均未生效。
相关文件内容:
- sqlc.yaml初始配置:
version: "2" sql: - engine: "postgresql" schema: "internal/db/schema.sql" queries: "internal/db/queries.sql" gen: go: package: "db" out: "internal/db" sql_package: "pgx/v5"
- schema.sql:
CREATE SCHEMA go_htmx_todo; CREATE TABLE go_htmx_todo.todos ( id integer NOT NULL, task character varying(255) NOT NULL, done boolean DEFAULT false NOT NULL, created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, created_by integer NOT NULL, updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, updated_by integer NOT NULL );
- queries.sql:
-- name: GetTodo :one SELECT * FROM go_htmx_todo.todos WHERE id = $1 LIMIT 1;
正确配置方案
方案1:在Go生成器配置中直接指定重命名规则
在gen.go下添加rename字段,针对**数据库表的完全限定名(schema.table)**设置映射:
version: "2" sql: - engine: "postgresql" schema: "internal/db/schema.sql" queries: "internal/db/queries.sql" gen: go: package: "db" out: "internal/db" sql_package: "pgx/v5" # 键为表的完全限定名,值为期望的结构体名称 rename: "go_htmx_todo.todos": "Todo"
方案2:使用全局overrides配置
如果需要批量处理多个表,可使用全局overrides配置,同样以表的完全限定名为键:
version: "2" sql: - engine: "postgresql" schema: "internal/db/schema.sql" queries: "internal/db/queries.sql" gen: go: package: "db" out: "internal/db" sql_package: "pgx/v5" overrides: go: rename: "go_htmx_todo.todos": "Todo"
方案3:自定义命名规则(批量去除Schema前缀)
若有多个同Schema下的表,可通过naming配置自动批量去掉Schema前缀:
version: "2" sql: - engine: "postgresql" schema: "internal/db/schema.sql" queries: "internal/db/queries.sql" gen: go: package: "db" out: "internal/db" sql_package: "pgx/v5" naming: table: regex: # 匹配schema前缀,保留表名部分 pattern: "^go_htmx_todo\\.(.*)$" replacement: "$1"
原理说明
sqlc v2中,重命名规则的键需要与**数据库表的完全限定名(schema.table)**完全匹配,而非生成后的结构体名称。此前尝试的各种驼峰化名称匹配无效,因为sqlc优先识别表的原始标识符进行重命名映射。
执行sqlc generate后,internal/db/models.go中会生成名为Todo的结构体,符合预期。
内容的提问来源于stack exchange,提问作者Fernando Correia
相关产品推荐
相关产品推荐

