Ruby 2.7环境下dbd-pg(0.3.9) Gem无法正常工作的问题求助
你遇到的问题确实很典型——老旧Ruby库(dbd-pg 0.3.9)和新版本PG gem(1.2.3)在Ruby 2.7环境下的兼容性冲突,加上你是首次接触Ruby,我会尽量用直白的步骤帮你排查解决:
第一步:确认版本依赖冲突
先验证dbd-pg 0.3.9对PG gem的版本要求。你可以尝试强制安装PG 0.9.0,看看Ruby 2.7是否支持:gem install pg -v 0.9.0如果安装失败(比如提示Ruby版本不兼容),那确实是版本适配问题,需要换其他方案推进。
第二步:尝试锁定兼容的PG版本
如果PG 0.9.0无法安装,你可以尝试找出dbd-pg 0.3.9能兼容的最高PG版本。创建一个Gemfile来管理依赖:source 'https://rubygems.org' gem 'dbd-pg', '0.3.9' gem 'pg', '<= 1.0.0' # 可以先试这个版本,不行再逐步调低然后运行
bundle install安装匹配的依赖组合,再用bundle exec ruby C:/Virtuoz/analytics/setup/setup_analytics_databases.rb来运行脚本,确保使用的是锁定的兼容版本。第三步:修改dbd-pg的兼容代码(进阶尝试)
从报错栈来看,问题出在dbd/pg/database.rb的initialize方法的rescue块中。你可以打开这个文件(路径:C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/dbd-pg-0.3.9/lib/dbd/pg/database.rb),查看第40-81行的代码。大概率是旧版本PG的API在新版本中发生了变化(比如方法名、参数结构变更)。
举个常见的例子:旧版本PG用PGconn.connect,新版本换成了PG.connect,你可以尝试修改这些调用适配新API,保存后再运行脚本测试。第四步:长期方案——替换为现代数据库库
dbd-pg和dbi都是停止维护的老旧库,兼容性问题会越来越多。如果上面的方法都走不通,建议修改脚本中的数据库连接逻辑,换成更现代的库,比如直接使用PG gem的原生API,或者Sequel、ActiveRecord这类ORM。
比如用PG原生API连接的简单示例:require 'pg' # 根据你的数据库配置修改参数 conn = PG.connect( dbname: 'your_database_name', user: 'your_username', password: 'your_password', host: 'your_host' ) # 执行查询示例 conn.exec("SELECT 1") do |result| result.each { |row| puts row } end conn.close
内容的提问来源于stack exchange,提问作者Akash Chourasia

