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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:37:05