Подключение к Postgres через database_url и Unix Socket in Rails

Я охотился за этим и просто не могу найти решение.

В настоящее время у меня есть database.yml, успешно подключенный к локальному серверу pgbouncer в гнезде Unix. Тем не менее, я перехожу к установке этого параметра в переменную среды database_url и не могу вообще разобраться, как подключиться к локальному серверу Postgres через сокет Unix. localhost явно работает нормально.

Я смотрел URL-адрес, который выглядит так, как будто вы можете использовать его с Postgres (http://www.postgresql.org/docs/9.2/interactive/libpq-connect.html):

export DATABASE_URL="postgresql://[email protected]%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://[email protected]%Fvar%Frun%Fpostgresql%F.s.PGSQL.6432/dbname

Кто-нибудь имеет представление о секретном соусе, который необходим для этого? У меня Googles бесконечно и ничего не нашел. Это должно быть возможно, так как приложение в настоящее время подключается через сокет.

Спасибо заранее,

Ответ 1

Вы должны опустить хост для использования unix-сокета, например:

postgres://[email protected]/dbname

или просто

postgres:///dbname

Это работает с psql > 9.2.

Я не уверен, что он работает с обработкой rails URL-адреса базы данных.

Ответ 2

31.1.1.2. URI подключения

Общая форма для URI соединения:

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

Обозначение схемы URI может быть либо postgresql://, либо postgres://. Каждая из частей URI является необязательной. Следующие примеры иллюстрируют допустимый синтаксис URI использует:

postgresql:// postgresql://localhost postgresql://localhost:5433 postgresql://localhost/mydb postgresql://[email protected] postgresql://user:[email protected] postgresql://[email protected]/otherdb?connect_timeout=10&application_name=myapp

Компоненты иерархической части URI также могут быть указаны как параметры. Например:

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

Процент-кодирование может использоваться для включения символов со специальным значением в любой части URI.

Любые параметры подключения, не соответствующие ключевым словам, перечисленным в Раздел 31.1.2 игнорируется, и предупреждающее сообщение о них отправляется STDERR.

Для улучшения совместимости с URI-соединениями JDBC, экземпляры параметр ssl=true переводятся в sslmode=require.

Хост-часть может быть либо именем хоста, либо IP-адресом. Чтобы указать IPv6, заключите его в квадратные скобки:

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

Компонент хоста интерпретируется, как описано для узла параметров. В частности, соединение сокета в домене Unix выбирается, если хост часть либо пуста, либо начинается с косой черты, в противном случае TCP/IP инициируется соединение. Обратите внимание, однако, что косая черта зарезервирована символа в иерархической части URI. Итак, чтобы указать нестандартный каталог сокетов для Unix-доменов, опустите хост в URI и указать хост в качестве параметра или % -кодировать путь в хост-компоненте URI:

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

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

Ответ 3

Вы можете передать сокет в качестве параметра запроса:

postgresql://[email protected]/database?socket=/path/to/socket

Ответ 4

Ответ, предоставленный @blnc, правильный, если использовать libpq в целом. Однако, если вы используете Activerecord или RubyonRails, по крайней мере, в версии 3.2.21, этот модуль анализирует URI на Ruby URI.parse, а не напрямую передает его libpq. URI.parse не может обрабатывать пустое имя хоста здесь.

irb(main):020:0> URI.parse "postgresql://user:[email protected]/dbname"
=> #<URI::Generic:0x7f72b17f04d8 URL:postgresql://user:[email protected]/dbname>

Но без хоста:

irb(main):021:0> URI.parse "postgresql://user:[email protected]/dbname"
URI::InvalidURIError: the scheme postgresql does not accept registry part: user:[email protected] (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).