通过Rails中的database_url和Unix Socket连接到Postgres

时间:2014-11-20 11:03:03

标签: rails-activerecord

我一直在寻找这个,但却找不到解决方案。

目前我有一个database.yml成功连接到Unix套接字上的本地pgbouncer服务器。但是,我正在转换为将其设置为database_url环境变量,并且无法解决如何通过Unix套接字连接到本地Postgres服务器的问题。 localhost显然工作正常。

我正在查看一个看起来像这样的网址,因为显然你可以将它用于Postgres(http://www.postgresql.org/docs/9.2/interactive/libpq-connect.html):

export DATABASE_URL="postgresql://username@%Fvar%Frun%Fpostgresql%F.s.PGSQL.6432/dbname"

然而,这不会超过URI警察:

rubies/ruby-2.1.5/lib/ruby/2.1.0/uri/common.rb:176:in `split': bad URI(is not URI?): postgresql://username@%Fvar%Frun%Fpostgresql%F.s.PGSQL.6432/dbname

有没有人对这需要的秘制酱有任何想法?我谷歌无休止地找不到任何东西。它必须是可能的,因为应用程序现在通过套接字连接。

提前致谢,

5 个答案:

答案 0 :(得分:14)

您必须省略主机才能使用unix socket,如下所示:

postgres://username@/dbname

或只是

postgres:///dbname

这适用于psql> 9.2。

我不确定它是否适用于数据库URL的rails处理。

答案 1 :(得分:12)

  

<强> 31.1.1.2. Connection URIs

     

连接URI的一般形式是:

     

postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]

     

URI方案指示符可以是postgresql://或postgres://。   每个URI部分都是可选的。以下示例说明   有效的URI语法使用:

     

postgresql:// postgresql://localhost postgresql://localhost:5433   postgresql://localhost/mydb postgresql://user@localhost   postgresql://user:secret@localhost   postgresql://other@localhost/otherdb?connect_timeout=10&application_name=myapp

     

URI的层次结构部分的组成部分也可以给出   参数。例如:

     

postgresql:///mydb?host=localhost&port=5433

     

百分比编码可用于包括具有特殊含义的符号   在任何URI部分中。

     

任何与中列出的关键词不对应的连接参数   忽略第31.1.2节,并发送有关它们的警告消息   标准错误,

     

为了改善与JDBC连接URI的兼容性,实例   参数ssl=true已翻译为sslmode=require

     

主机部分可以是主机名或IP地址。指定一个   IPv6主机地址,用方括号括起来:

     

postgresql://[2001:db8::1234]/database

     

主机组件的解释与参数主机的描述相同。   特别是,如果是主机,则选择Unix域套接字连接   part为空或以斜杠开头,否则为TCP / IP   连接已启动。但请注意,斜杠是保留的   URI的层次结构部分中的字符。 因此,要指定   非标准的Unix域套接字目录,省略主机   URI中的规范并将主机指定为参数,或   对URI的主机组件中的路径进行百分比编码:

     

postgresql:///dbname?host=/var/lib/postgresql

     

postgresql://%2Fvar%2Flib%2Fpostgresql/dbname

答案 2 :(得分:1)

您可以将套接字作为查询参数传递:

postgresql://user@host/database?socket=/path/to/socket

答案 3 :(得分:1)

如果一般使用libpq,@ blnc提供的答案是正确的。但是,如果您使用的是Activerecord或RubyonRails,至少在版本3.2.21中,该模块会将URI解析为Ruby的URI.parse,而不是直接将其传递给libpq。 URI.parse在这里无法处理空主机名。

irb(main):020:0> URI.parse "postgresql://user:pass@host/dbname"
=> #<URI::Generic:0x7f72b17f04d8 URL:postgresql://user:pass@host/dbname>

但是,没有主持人:

irb(main):021:0> URI.parse "postgresql://user:pass@/dbname"
URI::InvalidURIError: the scheme postgresql does not accept registry part: user:pass@ (or bad hostname?)
        from /usr/lib/ruby/1.8/uri/generic.rb:195:in `initialize'
        from /usr/lib/ruby/1.8/uri/common.rb:492:in `new'
        from /usr/lib/ruby/1.8/uri/common.rb:492:in `parse'
        from (irb):21
        from /usr/lib/ruby/1.8/uri/generic.rb:556

似乎无法在不添加自定义URI解析代码(或更改activerecord)的情况下解决此问题。

答案 4 :(得分:0)

在 Archlinux 上,unix_socket_directories 的默认路径:

postgres:///<dbname>?host=/run/postgresql/