升级至pg 1.5.2后出现PG::Coder.new(hash)弃用警告,寻求解决方法
解决pg 1.5.2升级后PG::Coder.new(hash)弃用警告问题
问题根源:pg gem 1.5.2开始弃用了PG::Coder.new(hash)的传参方式,要求改用关键字参数,但你当前使用的Rails 7.0.4.3尚未适配这个变化,因此控制台持续出现警告。
以下是几种可行的解决办法:
- 升级Rails版本:直接把Rails升级到7.0.5或更高版本,官方已经在这个版本修复了对pg 1.5+的适配问题,升级后警告会自动消失。
- 猴子补丁临时修复:如果暂时无法升级Rails,可通过补丁修改ActiveRecord的适配方法:
在项目的config/initializers目录下新建fix_pg_coder_warning.rb文件,写入以下代码:
# config/initializers/fix_pg_coder_warning.rb module ActiveRecord module ConnectionAdapters class PostgreSQLAdapter < AbstractAdapter def update_typemap_for_default_timezone if @default_timezone != ActiveRecord.default_timezone && @timestamp_decoder decoder_class = ActiveRecord.default_timezone == :utc ? PG::TextDecoder::TimestampUtc : PG::TextDecoder::TimestampWithoutTimeZone # 将哈希转为关键字参数传递,消除弃用警告 @timestamp_decoder = decoder_class.new(**@timestamp_decoder.to_h) @connection.type_map_for_results.add_coder(@timestamp_decoder) @default_timezone = ActiveRecord.default_timezone configure_connection end end end end end
保存文件后重启服务,警告即可消除。这个补丁的核心是用**运算符把哈希展开为关键字参数,符合pg 1.5+的API要求。
- 降级pg gem:临时把pg gem版本降到1.4.x,也能避开这个警告,但不推荐长期使用,会错过pg gem的后续更新。
内容的提问来源于stack exchange,提问作者alagaesia
相关产品推荐
相关产品推荐

