2014-11-20 7 views
10

Ho cercato e non riesco a trovare una soluzione.Connessione a Postgres tramite database_url e Unix Socket in Rails

Attualmente ho un database.yml connesso a un server pgbouncer locale su un socket Unix con successo. Tuttavia, sto passando all'impostazione di questa variabile di ambiente database_url e non riesco a capire come collegarmi a un server Postgres locale tramite un socket Unix. localhost ovviamente funziona bene.

stavo guardando un URL che assomiglia a questo, come a quanto pare è possibile utilizzare questo con 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" 

Tuttavia, questo non superare la polizia 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 

Qualcuno ha qualche idea sulla salsa segreta necessaria per questo? Ho Googles all'infinito e non ho trovato nulla. Deve essere possibile poiché l'applicazione si collega attualmente su un socket ora.

Grazie in anticipo,

risposta

1

È possibile passare la presa come parametro di query:

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

È necessario omettere l'host di utilizzare socket UNIX, in questo modo:

postgres://[email protected]/dbname 

o semplicemente

postgres:///dbname 

Funziona con psql> 9.2.

Non sono sicuro che funzioni con la gestione dei binari dell'URL del database.

+1

Questo non funziona con Rails 4.2.5 e PostgreSQL 9.3 –

8

31.1.1.2. Connection URIs

La forma generale per una connessione URI è:

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

Lo schema designatore URI può essere postgresql: // o postgres: //. Ognuna delle parti URI è opzionale. I seguenti esempi illustrano valido sintassi URI utilizza:

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

Componenti della parte gerarchica del URI può anche essere somministrato come parametri. Ad esempio:

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

percentuale di codifica può essere usato per includere simboli con significato speciale in nessuna delle parti URI.

Parametri di connessione non corrispondenti alle parole chiave elencate in Sezione 31.1.2 vengono ignorati e un messaggio di avviso su di loro viene inviato a stderr.

Per una migliore compatibilità con connessione JDBC URI, istanze di parametro ssl=true sono tradotti in sslmode=require.

La parte host può essere un nome host o un indirizzo IP. Per specificare un indirizzo host IPv6 , racchiuderlo tra parentesi quadre:

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

Il componente host viene interpretato come descritto per l'host parametro. In particolare, viene scelta una connessione socket dominio Unix se la parte host è vuota o inizia con una barra, altrimenti viene avviata una connessione TCP/IP . Si noti, tuttavia, che la barra è un carattere riservato nella parte gerarchica dell'URI. Quindi, per specificare una directory presa dominio Unix non standard , né omettere l'host specifica nel URI e specificare l'host come parametro, o cento-codificare il percorso nel componente di accoglienza dell'URI:

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

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

+0

localhost si collega tramite TCP/IP (127.0.0.1, :: 1, fe80 :: 1% lo0, ecc.). Per utilizzare il socket Unix come OP chiesto omettere l'host. –

+0

ha aggiornato la risposta – blnc

+1

Bugie bugie! Sto usando 'postgresql: // user: pass/dbname' senza alcun risultato. Ho provato molte varianti di quanto sopra. Sembra essere binari 3.2.21. Non ricevo alcun messaggio di errore significativo dall'applicazione (openproject), ma il modulo tcp registra almeno un errore di autorizzazione con pg. @ J.Money – Otheus

0

La risposta fornita da @blnc è corretta se si utilizza libpq in generale. Tuttavia, se si utilizza Activerecord o RubyonRails, almeno nella versione 3.2.21, tale modulo analizza l'URI su Ruby URI.parse, invece di passarlo direttamente a libpq. URI.parse non può gestire qui un hostname vuoto.

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

Ma, senza host:

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 

Non sembra esserci alcun modo per risolvere questo problema senza l'aggiunta di codice personalizzato URI-parsing (o alterare ActiveRecord).