执行sqlc generate命令时提示relation "users"不存在,寻求解决方法
执行
sqlc generate时报错:relation "users" does not exist 错误信息
PS C:\Users\%USERNAME%\Documents\project_1> sqlc generate # package sql\queries\users.sql:1:1: relation "users" does not exist
文件结构说明
项目根目录下包含:
sql文件夹,内部分为schema和queries两个子文件夹sql/schema:存放数据库表结构定义文件sql/queries:存放SQL查询语句文件(如users.sql)
- 根目录下的
sqlc.yaml配置文件
数据库Schema文件内容
-- +goose up CREATE TABLE users ( id UUID PRIMARY KEY, created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL, name TEXT NOT NULL ); -- +goose down DROP TABLE USERS;
SQL查询语句文件内容
-- name: CreateUser :one INSERT INTO users (id, created_at, updated_at, name) VALUES ($1, $2, $3, $4) RETURNING *;
sqlc配置文件内容
version: "2" sql: - schema: "sql/schema" queries: "sql/queries" engine: "postgresql" gen: go: out: "internal/database"
已尝试的操作
- 修改文件及文件夹结构
- 重命名文件和查询语句
- 查找类似问题
期望结果
- 终端无错误输出
- 生成包含
database子文件夹及对应Go代码的internal文件夹
解决方法
问题核心是sqlc无法识别带有Goose注释的表结构定义,导致它找不到users表的创建语句。可以用以下两种方式解决:
方法1:调整Schema文件格式
直接移除Schema文件中的-- +goose up和-- +goose down注释,让sqlc能直接读取到CREATE TABLE语句:
CREATE TABLE users ( id UUID PRIMARY KEY, created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL, name TEXT NOT NULL );
方法2:在sqlc配置中启用Goose支持
如果需要保留Goose注释,在sqlc.yaml中添加schema_loader配置,让sqlc解析Goose格式的Schema:
version: "2" sql: - schema: "sql/schema" queries: "sql/queries" engine: "postgresql" schema_loader: goose: true gen: go: out: "internal/database"
额外检查项:
- 确保
sql/schema下的文件都是.sql后缀,sqlc只会处理该后缀的文件 - 确认配置中的路径
sql/schema和sql/queries是相对于项目根目录的正确路径,没有拼写错误
内容的提问来源于stack exchange,提问作者Kaliban
相关产品推荐
相关产品推荐

