执行sqlc generate报错'relation "users"不存在'的问题求助
问题原因与解决方法
问题根源
sqlc无法正确解析带有Goose迁移注释(-- +goose Up/Down)的迁移文件,导致它未能识别到users表的定义。当你将建表语句移至不含这些迁移注释的文件时,sqlc可以正常读取表结构,因此操作成功。
解决方案
方案一:分离迁移文件与sqlc Schema文件(推荐)
- 保留
db/migrations目录存放Goose迁移文件(带-- +goose注释的文件) - 在
db目录下新建schema文件夹,创建schema.sql文件,将所有表的纯DDL语句(例如users表的创建语句,移除Goose相关注释)放入该文件 - 修改
sqlc.yml的schema配置项:version: "2" sql: - name: "db" queries: "./db/queries" schema: "./db/schema" # 改为指向新的schema目录 engine: "postgresql" gen: go: package: "sqlc" out: "./internal/database/sqlc" sql_package: "pgx/v5"
方案二:调整迁移文件兼容sqlc解析
在迁移文件中添加sqlc的块注释标记,让它提取Up块内的DDL内容:
-- +goose Up -- sqlc:begin -- +goose StatementBegin create table if not exists users ( id serial primary key, email varchar(255) unique not null, first_name varchar(100) not null, last_name varchar(100) not null, date_of_birth date not null, phone_number varchar(15) not null, terms_accepted boolean not null default false, created_at timestamp with time zone default current_timestamp, updated_at timestamp with time zone default current_timestamp ); do $$ begin if not exists (select 1 from pg_constraint where conname = 'email_format_chk') then alter table users add constraint email_format_chk check (email ~* '^[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\.[a-za-z]{2,}$'); end if; end $$; select set_updated_at_trigger('users'); -- +goose StatementEnd -- sqlc:end -- +goose Down -- +goose StatementBegin drop table users; -- +goose StatementEnd
完成上述调整后,执行sqlc generate即可正常识别users表,不再报错。
内容的提问来源于stack exchange,提问作者BamBam22
相关产品推荐
相关产品推荐

