先把当时的情况摆出来。在 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,用连接池时尤其要确认连的是同一个库。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
