Domanda

Sto usando SQLalchemy per un progetto Python e voglio avere una stringa di connessione ordinata per accedere al mio database. Quindi ad esempio:

engine = create_engine('postgres://user:pass@host/database')

Il problema è che la mia password contiene una sequenza di caratteri speciali che vengono interpretati come delimitatori quando provo a connettermi.

Mi rendo conto che potrei semplicemente creare un oggetto e quindi passare le mie credenziali in questo modo:

drivername  = 'postgres',
username    = 'user', 
password    = 'pass', 
host        = 'host',
database    = 'database'

Ma preferirei molto usare una stringa di connessione se questo è possibile.

Per essere chiari, è possibile codificare la mia stringa di connessione o la parte della password della stringa di connessione - in modo che possa essere analizzata correttamente?

È stato utile?

Soluzione

Le barre rovesciate non sono caratteri di escape validi per le stringhe dei componenti URL. È necessario codificare l'URL nella parte della password della stringa di connessione:

from urllib import quote_plus as urlquote
from sqlalchemy.engine import create_engine
engine = create_engine('postgres://user:%s@host/database' % urlquote('badpass'))

Se guardi l'implementazione della classe utilizzata in SQLAlchemy per rappresentare gli URL di connessione al database (in sqlalchemy / engine / url.py ), puoi vedere che usano lo stesso metodo per sfuggire alle password durante la conversione delle istanze URL in stringhe e che il codice di analisi utilizza la funzione urllib.unquote_plus complementare per estrarre la password da una stringa di connessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top