Подключение к 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 ответов
Общая форма для 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, игнорируются и предупреждающее сообщение о них отправляется в 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/