使用 Postgres 安装最新版本的 Rails 4 - 不推荐使用 PGconn、PGresult 和 PGError 常量

Posted

技术标签:

【中文标题】使用 Postgres 安装最新版本的 Rails 4 - 不推荐使用 PGconn、PGresult 和 PGError 常量【英文标题】:Installing newest version of Rails 4 with Postgres - The PGconn, PGresult, and PGError constants are deprecated 【发布时间】:2017-06-17 17:15:18 【问题描述】:

我无法在 Google 上找到此警告,因此请求 Stackowerflower 的帮助。

我想在新的 Centos 7 机器上安装 Rails 4.2.8。 Postgres 版本是 9.2.18。 Ruby 版本是 2.3.4。

安装 Rails 后,我像往常一样配置 config/database.yml 文件,并且非常确定 database.yml 文件可以成功连接到数据库。 Postgres 已为其他应用成功运行,并为此应用创建了新角色。

下一步有一个实际问题:

[user@server dir]$ rake db:setup
The PGconn, PGresult, and PGError constants are deprecated, and will be
removed as of version 1.0.

You should use PG::Connection, PG::Result, and PG::Error instead, respectively.

Called from /home/user/.rbenv/versions/2.3.4/lib/ruby/gems/2.3.0/gems/activesupport-4.2.8/lib/active_support/dependencies.rb:240:in `load_dependency'
/home/rent/apps/rent/db/schema.rb doesn't exist yet. Run `rake db:migrate` to create it, then try again. If you do not intend to use a database, you should instead alter /home/user/apps/rent/config/application.rb to limit the frameworks that will be loaded.
[user@server dir]$

这是否确认 Rails 已成功连接到 Postgres?如何简单检查?

如果是,我可以在 Rails 4.2.8 中使用类似的 Postgres 版本多长时间?

有趣的是,我没有收到具有非常相似设置的类似消息,因此我想确保我能够很好地使用此设置。

非常感谢

【问题讨论】:

【参考方案1】:

从 pg 0.20.0 升级到 pg 0.21.0 时,我注意到同样的弃用警告。我似乎对 pg 没有任何实际问题,我的应用程序(开发、登台和生产)似乎都运行良好。

但是,我发现警告很烦人,所以我将所有 Gemfile 锁定在 pg 0.20.0。

【讨论】:

gem 'pg', '~> 0.20.0' 添加到Gemfile 并消除了此警告。最初,Rails 尝试使用 0.21.0 遗憾的是这不会被反向移植到 rails 4.x 我有 0.21 页。我怎样才能让这个警告静音?【参考方案2】:

为避免使用 pg gem 的 0.21.0 之前的旧版本,将此文件放入 lib/pg/deprecated_constants.rb 并确保您的应用程序的 $LOAD_PATH 配置为在您的 pg gem 之前加载应用程序的 lib/ 目录中的文件安装路径。请参阅下面的 cmets 中的更多注释:

# File: lib/pg/deprecated_constants.rb
#
# This file overrides the pg gem's pg/deprecated_constants.rb file and so
# its warning message is not printed. Avoiding this warning message helps
# clean up the app startup and test output.
#
# This behaviour relies on lib/ being ahead of the pg gem in $LOAD_PATH and
# these lines from the pg gem's lib/pg.rb file:
# autoload :PGError,  'pg/deprecated_constants'
# autoload :PGconn,   'pg/deprecated_constants'
# autoload :PGresult, 'pg/deprecated_constants'
#
# Your config/application.rb may need to modify autoload_paths to ensure
# the lib/ dir is ahead of the pg gem install path in $LOAD_PATH:
#
# config.autoload_paths << Rails.root.join('lib')
#
if ('0.21.0' != PG::VERSION) || (ActiveRecord.version.to_s != '4.2.8')
  puts <<MSG
-----------------------------------------------------------------------------------
The pg and/or activerecord gem version has changed, meaning deprecated pg constants
may no longer be in use, so try deleting this file to see if the
'The PGconn, PGresult, and PGError constants are deprecated...' message has gone:
#__FILE__
-----------------------------------------------------------------------------------

MSG
end

# Declare the deprecated constants as is done in the original 
# pg/deprecated_constants.rb so they can still be used by older
# versions of gems such as activerecord.
PGconn   = PG::Connection
PGresult = PG::Result
PGError  = PG::Error

【讨论】:

很好的答案,很好的文档,非常适合我的情况。我确实注意到的一件事是这个文件可以设置为一个初始化程序,而无需修改 config/application.rb 如果有人选择的话。【参考方案3】:

或者,如果您想使用更新的 pg 版本,您可以修补恼人的贬损。注意:这将覆盖您的 gem 包中的文件:

在您的应用程序根目录中创建一个文件(即bin/monkey_patch.rb)它应该如下所示:

#bin/monkey_patch.rb
if pg_path = `bundle show pg --paths`.strip
   pg_deprications = pg_path + '/lib/pg/deprecated_constants.rb'
   nag_string = 'The PGconn, PGresult, and PGError constants are deprecated, and will be
removed as of version 1.0.

You should use PG::Connection, PG::Result, and PG::Error instead, respectively.

Called from #callsite'

  str = File.read pg_deprications
  if str.include? nag_string
    File.open(pg_deprications, 'w') |f| f.puts str.gsub(nag_string, '')
  end
end

然后在您的application.rb 文件中第一行require 之后添加第二行,这样将在应用程序启动之前猴子修补折旧。

require File.expand_path('../boot', __FILE__)
system('ruby ./bin/monkey_patch.rb')

这完全是 hack,但它可以工作,你可以使用更高版本的 ruby​​-pg gem。但是从我在v0.21.0v0.20.0 上的 git diff 可以看出,无论如何变化不大。但我想试试这个,它奏效了:)

【讨论】:

以上是关于使用 Postgres 安装最新版本的 Rails 4 - 不推荐使用 PGconn、PGresult 和 PGError 常量的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rails 5 在 Postgres 中存储字符串化 JSON

Postgres on Rails 致命:数据库不存在

postgresql-docker安装

使用 Activerecord、Rails 和 Postgres 查找具有多个重复字段的行

纱线安装说是最新的,但无法启动 Rails 控制台

如何在 Rails 3 的 Postgres 数据库中使用枚举? [关闭]