执行sqlc generate命令报错:‘relation users does not exist’
解决sqlc generate提示"relation 'users' does not exist"的问题
核心原因
sqlc默认依赖本地schema文件生成代码,而非直接读取数据库中已存在的表结构。哪怕数据库里已经有users表,只要sqlc没正确解析到本地的schema定义,就会抛出这个错误。
解决方案
1. 让sqlc直接连接数据库获取表结构
修改sqlc.yaml,添加db-url配置,让sqlc直接对接你的PostgreSQL数据库,跳过本地schema文件的解析环节:
version: "2" sql: - schema: "sql/schema" queries: "sql/queries" engine: "postgresql" db-url: "postgres://你的用户名:密码@localhost/数据库名?sslmode=disable" # 替换为你的实际连接串 gen: go: out: "internal/database"
重新执行sqlc generate,此时sqlc会直接从数据库拉取真实的users表结构,不会再依赖本地schema文件。
2. 确保sqlc正确读取本地schema文件
如果不想连接数据库,检查并调整以下配置:
- 明确指定schema文件路径,确保覆盖所有迁移文件:
schema: "sql/schema/*.sql" - 移除schema文件中的goose注释(
-- +goose up/-- +goose down),避免干扰sqlc的解析逻辑,修改后的001_users.sql:CREATE TABLE users ( id UUID PRIMARY KEY, created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL , name TEXT NOT NULL ); DROP TABLE users;
3. 显式指定schema名称
在查询语句里加上public schema前缀,让sqlc直接定位到目标表:
-- name: CreateUser :one INSERT INTO public.users (id, created_at, updated_at, name) VALUES ($1, $2, $3, $4) RETURNING *;
或者在sqlc.yaml的Go生成配置中指定默认搜索路径:
gen: go: out: "internal/database" search_path: ["public"]
内容的提问来源于stack exchange,提问作者Nay Aung Lin
相关产品推荐
相关产品推荐

