2013-03-28 12 views
20

Guardando l'output di select * from pg_stat_activity;, vedo una colonna denominata application_name, descritta here.Impostazione nome_applicazione su Postgres/SQLAlchemy

Vedo che psql imposta questo valore correttamente (su psql ...), ma il mio codice applicazione (psycopg2/SQLAlchemy) lascia vuoto.

mi piacerebbe impostare questo per qualcosa di utile, come web.1, web.2, ecc, in modo da poter in seguito correlare ciò che vedo in pg_stat_activity con quello che vedo nei miei registri delle applicazioni.

Non riesco a trovare come impostare questo campo utilizzando SQLAlchemy (e se arriva il momento critico - anche con raw sql; sto usando PostgresSQL 9.1.7 su Heroku, se questo è importante).

Mi manca qualcosa di ovvio?

risposta

27

la risposta a questa è una combinazione di:

http://initd.org/psycopg/docs/module.html#psycopg2.connect

Ogni altro parametro di connessione supportati dalla libreria client/server può essere passato sia nella stringa di connessione o come parole chiave. La documentazione di PostgreSQL contiene l'elenco completo di supported parameters. Si noti inoltre che gli stessi parametri possono essere passati alla libreria client utilizzando le variabili di ambiente.

dove la variabile cui abbiamo bisogno è:

http://www.postgresql.org/docs/current/static/runtime-config-logging.html#GUC-APPLICATION-NAME

Il nome_applicazione può essere qualsiasi stringa di caratteri inferiore a NAMEDATALEN (64 caratteri in una build standard). Generalmente viene impostato da un'applicazione al momento della connessione al server. Il nome verrà visualizzato nella vista pg_stat_activity e incluso nelle voci del registro CSV. Può anche essere incluso in normali voci di registro tramite il parametro log_line_prefix. Solo i caratteri ASCII stampabili possono essere utilizzati nel valore application_name. Altri personaggi saranno sostituiti con punti interrogativi (?).

combinato con:

http://docs.sqlalchemy.org/en/rel_0_8/core/engines.html#custom-dbapi-args

argomenti stringa-based possono essere passati direttamente dalla stringa URL come parametri di query: (esempio ...) create_engine() accetta anche un argomento connect_args che è un dizionario aggiuntivo che verrà passato a connect(). Questo può essere utilizzato quando sono richiesti argomenti di un tipo diverso di stringa, e il connettore del database di SQLAlchemy non ha alcuna logica di tipo di conversione presente per quel parametro

da che otteniamo:

e = create_engine("postgresql://scott:[email protected]/test?application_name=myapp") 

o:

+0

Vedi, sapevo che mi mancava qualcosa di ovvio :) Grazie per questo (e per SA!) –

+0

Hmmm, aspetta. Non sono sicuro del perché, ma questo funziona bene sul mio database di sviluppo (9.1.4/OSX) ma non sul database condiviso di Heroku (9.1.8/Linux) (ottenendo 'opzione di connessione non valida" nome_applicazione "').Stessa versione SA, stessa versione di psycopg2, probabilmente diversa libpq ecc. Ma 'psql application_name = foo_bar' funziona bene, sia localmente che contro Heroku. Qualche consiglio su questo? –

+0

che sarebbe psycopg2 farlo. prova la connessione psycopg2 direttamente e ricontrolla la versione, così come la versione di libpq su cui è basata. – zzzeek