将PostgreSQL从8.4升级到9.1 pg后,gem不会连接到数据库

时间:2014-01-23 16:00:39

标签: ruby postgresql pg

正如标题所说,我已将PostgreSQL数据库从版本8.4升级到9.1。

我的pg_hba.conf文件包含以下内容:

local   all        all            trust

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
#local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

我也运行了这些命令:

sudo gem uninstall pg
sudo apt-get remove libpq-dev
sudo apt-get install libpq-dev
sudo gem install pg
sudo service postgresql restart

当我从命令行运行psql时,一切正常,但是当我尝试从Ruby控制台连接时会发生什么:

$:  /va$ sudo pry
[1] pry(main)> require 'pg'
=> true
[2] pry(main)> conn = PG.connect( dbname: 'mydb' )
PG::ConnectionBad: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
from /usr/local/lib/ruby/gems/1.9.1/gems/pg-0.17.1/lib/pg.rb:40:in `initialize'

1 个答案:

答案 0 :(得分:2)

您的Pg gem使用的libpq版本默认使用与新服务器使用的unix_socket_directory不同的/tmp版本。您的新服务器很可能使用/var/run/postgresql而旧的服务器使用localhost

您可以通过将dbname=fred host=localhot user=bob指定为要连接的目标主机来强制TCP / IP连接,例如像pg这样的连字符,或者您将参数提供给Pg gem。但这并不是最好的答案。

相反,您应该:

  • 从新的PostgreSQL安装中,针对更新的libpq重建PATH gem。为此,请设置pg_config,以便在重建Pg gem之前,新PostgreSQL安装中的pg_config --version首先位于路径上。您可以使用unix_socket_directory检查版本。

  • 使用host=/tmp dbname=fred user=bob明确指定要host连接的{{1}}。 {{1}}参数可以将主机名作为套接字目录的路径。这样做意味着您仍然在为会话使用高效的unix套接字,而不是支付不必要的TCP / IP开销。