Golang怎么用sqlc从SQL生成类型安全代码_Golang如何根据SQL语句自动生成Go查询函数【教程】

张开发
2026/4/4 18:22:48 15 分钟阅读
Golang怎么用sqlc从SQL生成类型安全代码_Golang如何根据SQL语句自动生成Go查询函数【教程】
psqlc生成的Go代码编译失败主因是sqlc.yaml中schema或queries路径配置错误导致生成空struct而报undefined需确保路径正确、SQL文件格式合规含-- name: XXX :type、移除CREATE EXTENSION并配置engine: postgresql、emit_interface: true、emit_exact_table_names: true以兼容database/sql。/psqlc 生成的 Go 代码为什么编译不过常见原因是 sqlc.yaml 配置里没指定正确的 schema 或 queries 路径导致 sqlc 找不到 SQL 文件或读到空内容最终生成空 struct —— 编译时就会报 undefined 错误。确保 schema 指向的是 PostgreSQL/MySQL 的 DDL 文件如 schema.sql不是数据库连接地址queries 必须是含 SELECT/INSERT 等语句的 .sql 文件且每条语句以 -- name: XXX :type 开头比如 -- name: GetUsers :many路径用相对路径从 sqlc.yaml 所在目录算起若用 ./sql/ 却实际放在 db/sql/就静默失败PostgreSQL 用户注意sqlc 默认不支持 CREATE EXTENSION这类语句要从 schema.sql 中移除或注释掉怎么让 sqlc 生成带 database/sql 兼容的函数而不是 pgxsqlc 默认输出依赖 pgx/v5但很多项目还在用标准库 database/sql lib/pq 或 jackc/pgconn。关键在 sqlc.yaml 的 engine 和 emit_json_tags 之外的两个配置项设 engine: postgresql不是 postgresqlpgx加 emit_interface: true这样会生成 Querier 接口你就能用 sql.DB 实现它别漏掉 emit_exact_table_names: true否则生成的 struct 字段名可能和 Scan 不匹配比如字段叫 UserID但数据库列是 user_id没这个选项就可能映射成 UserId生成后手动实现接口即可type DBTX interface { ExecContext(context.Context, string, ...interface{}) (sql.Result, error) QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) QueryRowContext(context.Context, string, ...interface{}) *sql.Row}func New(db DBTX) *Queries { return Queries{db: db} }SQL 注释里的 :one、:many、:exec 到底影响什么这不是可选语法糖而是 sqlc 生成逻辑的开关它直接决定返回值类型、错误检查方式、甚至是否包装 sql.ErrNoRows。 Zeemo AI 一款专业的视频字幕制作和视频处理工具

更多文章