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

执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:13:25