GitHub Actions中PostgreSQL15+pgvector+Rails7报错vector.control未找到
问题概述
在GitHub Actions工作流中运行Rails测试套件时,执行enable_extension 'vector'迁移时触发错误:
ActiveRecord::StatementInvalid: PG::UndefinedFile: ERROR: could not open extension control file "/usr/share/postgresql/1***/extension/vector.control": No such file or directory
已确认信息:
- 环境仅运行PostgreSQL 15版本
vector.control文件存在于/usr/share/postgresql/15/extension/路径,权限与其他扩展一致- 已通过
apt-get及手动方式安装pgvector,安装日志显示配置完成 - 安装后已重启PostgreSQL
- 已将文件路径加入环境变量
- 容器为
ubuntu-latest,用到redis:alpine镜像,Ruby版本3.2.2,所有gem安装正常
可能原因及解决步骤
1. 确保pgvector与PostgreSQL版本严格匹配
ubuntu-latest的apt源中,pgvector分版本提供对应包(如postgresql-15-pgvector适配PostgreSQL 15),若仅执行apt-get install pgvector,可能安装的是适配其他PostgreSQL版本的包,导致扩展文件路径不匹配。
解决操作:
在工作流的安装步骤中,明确指定安装对应版本的pgvector:
sudo apt-get update sudo apt-get install -y postgresql-15-pgvector
2. 验证PostgreSQL实际使用的扩展路径
PostgreSQL的extension_dir配置可能未指向预期路径,导致无法找到vector扩展文件。
解决操作:
在工作流中添加步骤,检查当前PostgreSQL实例的扩展路径:
sudo -u postgres psql -c "SHOW extension_dir;"
如果输出不是/usr/share/postgresql/15/extension/,需修改PostgreSQL配置文件(如/etc/postgresql/15/main/postgresql.conf),设置extension_dir = '/usr/share/postgresql/15/extension/',然后重启服务。
3. 确认工作流步骤顺序与服务重启有效性
若在启动PostgreSQL服务后才安装pgvector,即使后续重启,可能存在服务未彻底重载的情况。
解决操作:
调整工作流步骤顺序为:
- 安装PostgreSQL 15
- 安装
postgresql-15-pgvector - 启动PostgreSQL服务
- (可选)添加服务就绪检查:
until sudo -u postgres pg_isready; do sleep 1; done
若必须先启动服务再安装扩展,需执行彻底重启命令:
sudo systemctl restart postgresql # 或针对特定版本实例 sudo pg_ctlcluster 15 main restart
4. 验证PostgreSQL运行用户的文件访问权限
虽然文件权限显示正常,但PostgreSQL以postgres用户运行,需确认该用户能读取vector.control文件。
解决操作:
在工作流中添加权限验证步骤:
sudo -u postgres ls -l /usr/share/postgresql/15/extension/vector.control
若输出提示权限不足,调整文件权限:
sudo chmod 644 /usr/share/postgresql/15/extension/vector.control sudo chown postgres:postgres /usr/share/postgresql/15/extension/vector.control
5. 排除Rails迁移的环境变量问题
确保Rails连接的PostgreSQL实例是安装了pgvector的那个,避免因数据库连接配置错误(如指向其他容器或实例)导致的扩展找不到问题。
解决操作:
在迁移步骤前,添加验证步骤:
# 验证数据库连接 bundle exec rails db:version # 尝试直接通过psql启用扩展 sudo -u postgres psql -d your_test_db_name -c "CREATE EXTENSION IF NOT EXISTS vector;"
内容的提问来源于stack exchange,提问作者Ron

