Подключение к Postgres через database_url и Unix Socket в 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://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 ответов

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

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

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

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

postgresql:// postgresql://localhost postgresql://localhost:5433postgresql://localhost/mydb postgresql://user@localhostpostgresql://user:secret@localhostpostgresql://other@localhost/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

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

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

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

Вы должны опустить хост, чтобы использовать сокет Unix, например так:

postgres://username@/dbname

или просто

postgres:///dbname

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

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

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

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

Ответ, предоставленный @blnc, является правильным при использовании libpq в общем. Однако, если вы используете 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).

В Archlinux с путем по умолчанию для unix_socket_directories:

      postgres:///<dbname>?host=/run/postgresql/
Другие вопросы по тегам