GitHub工作流测试用例因PG::UndefinedFunction报错求助:array_append函数不存在
这问题我之前碰到过类似的,虽然你只是做了空格相关的修改,但报错根源大概率和PostgreSQL版本、ActiveMedian兼容性或者数据库环境配置有关,咱们一步步拆解排查:
1. 确认测试环境的PostgreSQL版本
array_append是PostgreSQL的内置函数,但如果你的测试环境PG版本和之前正常运行时发生了变更(比如CI环境自动升级/降级了),可能会引发兼容性问题。
可以在测试环境执行以下命令查看版本:
psql -c "SELECT version();"
对比这个版本和之前测试正常时的PG版本,如果差异较大,优先考虑对齐到之前的稳定版本。
2. 检查ActiveMedian依赖版本
即使你没修改Gemfile,也有可能在某次bundle install时被动更新了ActiveMedian版本,而新版本和当前测试环境的PG存在兼容性冲突。
查看当前锁定的版本:
cat Gemfile.lock | grep active_median
对比这个版本和之前测试正常时的版本,如果不一致,尝试锁定到旧版本(在Gemfile中指定版本号):
gem 'active_median', 'x.x.x' # 替换为之前正常运行的版本号
然后执行bundle install重新安装依赖。
3. 验证数据库搜索路径配置
报错提示找不到array_append,有可能是数据库的搜索路径未包含pg_catalog(内置函数所在的schema)。
在ActiveMedian.create_function调用前,临时添加搜索路径检查和设置:
# 在spec/rails_helper.rb的seed方法中,create_function执行前添加 puts ActiveRecord::Base.connection.execute("SHOW search_path;").first ActiveRecord::Base.connection.execute("SET search_path TO pg_catalog, public;")
然后重新运行测试,看是否解决问题。
4. 手动执行SQL排查
把报错中的SQL语句手动复制到测试数据库中执行,判断是SQL本身的问题还是测试上下文的问题:
- 进入测试数据库:
psql your_app_test(替换为你的测试数据库名) - 依次执行报错中的
CREATE FUNCTION、DROP AGGREGATE、CREATE AGGREGATE语句
如果手动执行也报错,说明是数据库环境本身的问题;如果手动执行成功,那可能是测试代码执行时的上下文异常(比如事务隔离级别、其他前置操作影响)。
5. 重置测试数据库
有时候数据库状态异常(比如残留的旧函数、损坏的schema)会导致这种奇怪的问题,尝试完全重置测试数据库:
rails db:drop db:create db:migrate RAILS_ENV=test
然后重新运行测试。
内容的提问来源于stack exchange,提问作者Mayur Shah

