Ответ 1
Вы должны опустить хост для использования unix-сокета, например:
postgres://[email protected]/dbname
или просто
postgres:///dbname
Это работает с psql > 9.2.
Я не уверен, что он работает с обработкой rails URL-адреса базы данных.
Я охотился за этим и просто не могу найти решение.
В настоящее время у меня есть 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 бесконечно и ничего не нашел. Это должно быть возможно, так как приложение в настоящее время подключается через сокет.
Спасибо заранее,
Вы должны опустить хост для использования unix-сокета, например:
postgres://[email protected]/dbname
или просто
postgres:///dbname
Это работает с psql > 9.2.
Я не уверен, что он работает с обработкой rails URL-адреса базы данных.
Общая форма для 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
Вы можете передать сокет в качестве параметра запроса:
postgresql://[email protected]/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:[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).