Rails从5.1.3升级至5.2.3后PgQuery gem无法正常运行报错
问题根因
- pg_query 2.0及以上版本存在不兼容的API变更:1.x版本中
PgQuery.parse()方法直接返回语法树数组,可直接调用first方法取值;2.0+版本中该方法返回的是PgQuery::ParseResult对象,语法树数组存储在该对象的tree属性中,直接对返回对象调用first方法就会触发你遇到的报错。 - 你删除Gemfile.lock后执行
bundle update,直接将pg_query升级到了最新的2.1.0版本,而现有代码中的调用逻辑还是适配1.x版本的写法,因此触发报错。
额外提示:不要随意删除Gemfile.lock文件,该文件会锁定所有依赖的版本,避免非预期的跨大版本升级引发不兼容问题。如果需要单独升级某一个依赖,使用
bundle update [gem名称]的方式指定升级即可。
解决办法
方案一:修改代码适配2.x版本API
找到项目中所有调用PgQuery.parse的位置,将原有类似如下的写法:
parsed_result = PgQuery.parse(sql).first
修改为适配2.x版本的写法:
parsed_result = PgQuery.parse(sql).tree.first
修改完成后即可正常运行。
方案二:锁定pg_query到兼容的1.x版本
如果暂时不想修改业务代码,可在Gemfile中指定pg_query的版本范围,锁定到兼容的1.x稳定版:
在Gemfile中添加如下配置:
gem 'pg_query', '~> 1.3'
之后执行bundle update pg_query重新安装对应版本即可,1.x版本API与现有代码逻辑完全兼容。
内容的提问来源于stack exchange,提问作者Animesh
相关产品推荐
相关产品推荐

