Scrivere una stringa di connessione quando la password contiene caratteri speciali
-
07-07-2019 - |
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?
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.