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

Installing newest version of Rails 4 with Postgres - The PGconn, PGresult, and PGError constants are deprecated

我无法在 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 版本多长时间?

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

非常感谢

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

然而,我发现这个警告很烦人,所以我将我所有的 Gemfiles 锁定在 pg 0.20.0。

或者如果您想使用较新的 pg 版本,您可以猴子修补烦人的 deprications。注意:这将覆盖 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')

这完全是黑客攻击,但它确实有效,您可以使用 ruby-pg gem 的更高版本。但据我所知,v0.21.0v0.20.0 的 git 差异并没有太大变化。但我想试试这个,它奏效了:)

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

# 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