先把当时的情况摆出来。在 Postgres 16 上装了 pgvector 0.7,用 psycopg 3 建表时写 vector(1024) 报 type vector does not exist,但用 psql 登录同一库执行同样语句能成功。

把日志和配置对完,能解释这个现象的基本就这几处。扩展装在了另一个库,当前连接的库没有。另一种情况是建表语句跑在默认 search_path 之外的模式里。

还有一种情况,连接串指向了 pgBouncer 的另一个后端库。另外,扩展没执行 CREATE EXTENSION,只是装了包。

第一件事是确认当前库是否已启用扩展

python -c "import psycopg;print(psycopg.connect('dbname=rag').execute('select extname from pg_extension').fetchall())"

然后在目标库执行一次创建扩展

python -c "import psycopg;psycopg.connect('dbname=rag').execute('create extension if not exists vector')"

接着核对连接串实际连到的库名

python -c "import psycopg;print(psycopg.connect('dbname=rag').execute('select current_database()').fetchone())"

剩下的就是把 search_path 显式写进建表会话

python -c "import psycopg;psycopg.connect('dbname=rag').execute(\"set search_path to public\")"

这台环境是别人交接的,不少默认值被动过,只能一项项核。

别只看报错消失,验证要多做一步。建表与插入都能通过,查询 pg_type 能看到 vector 类型,应用侧不再报 type does not exist。

容易忽略的是,扩展是按库安装的,装完包还要在目标库执行 CREATE EXTENSION,用连接池时尤其要确认连的是同一个库。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189