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

RedshiftRecord调用触发ArgumentError:本地正常Dokku生产环境异常求助

问题

我正在使用RedshiftRecord访问备用数据库,本地机器运行代码完全正常,但通过Dokku部署到生产环境后,哪怕是执行如下极简调用:

sql_statement = <<-SQL
  SELECT COUNT(*)
  FROM table
SQL
RedshiftRecord.connection.execute(sql_statement)

都会抛出错误:

[web.1]: F, [...] FATAL -- : [...]   
[web.1]: [...] ArgumentError (wrong number of arguments (given 2, expected 0..1)):

这显然不符合预期,因为我仅传入了一条简单SQL语句。本地与生产环境均使用Ruby 2.6.6、Rails 6.0.3.7,以及activerecord6-redshift-adapter版本的RedshiftRecord,且已确认环境变量(尤其是数据库凭证)完全一致。

可能原因与排查方案

1. 依赖版本不一致(Gem锁定问题)

  • 本地可能存在未被Gemfile.lock锁定的依赖版本差异,生产环境部署时拉取了不同版本的底层依赖(比如pg gem,Redshift适配器基于pg开发)。
  • 排查:在本地和生产环境分别执行bundle show pg和bundle show activerecord6-redshift-adapter,对比版本是否完全一致。
  • 规避:确保Gemfile.lock提交到代码仓库,部署时使用bundle install --deployment严格按照锁定版本安装依赖。

2. Dokku环境的连接配置篡改

  • 虽然环境变量一致,但Dokku可能通过插件自动注入额外连接参数,导致RedshiftRecord的connection实例被修改,execute方法的调用签名被篡改。
  • 排查:在生产环境执行以下代码,查看方法参数定义是否与本地一致:
    puts RedshiftRecord.connection.class
    puts RedshiftRecord.connection.method(:execute).parameters.inspect
    
  • 规避:显式在database.yml中配置Redshift连接,不依赖Dokku自动注入的配置,确保连接实例的方法签名正确。

3. 生产环境独有的ActiveRecord Monkey Patch冲突

  • 生产环境可能加载了本地没有的第三方Gem或初始化脚本,对ActiveRecord的execute方法做了Monkey Patch,改变了参数要求。
  • 排查:在生产环境执行RedshiftRecord.connection.method(:execute).source_location,查看方法定义的文件路径,判断是否被第三方代码修改。
  • 规避:排查生产环境独有的Gem或初始化代码,移除或调整冲突的Monkey Patch。

4. 适配器的环境特定逻辑问题

  • activerecord6-redshift-adapter可能存在针对生产环境(如Rails.env.production)的特殊处理,导致execute方法的调用逻辑发生变化。
  • 排查:查看适配器源码是否存在基于环境分支的逻辑,或临时在生产环境切换到开发环境测试(仅用于排查,禁止长期使用)。
  • 规避:若确认是适配器的环境bug,尝试降级/升级适配器版本,或向维护者提交issue反馈。

内容的提问来源于stack exchange,提问作者CptDrMoreno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:15:46