Question

J'utilise SQLalchemy pour un projet Python et je souhaite disposer d'une chaîne de connexion ordonnée pour accéder à ma base de données. Ainsi, par exemple:

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

Le problème est que mon mot de passe contient une séquence de caractères spéciaux qui sont interprétés comme des délimiteurs lorsque je tente de me connecter.

Je réalise que je pourrais simplement créer un objet, puis transmettre mes informations d'identification comme ceci:

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

Mais je préférerais de loin utiliser une chaîne de connexion si cela est possible.

Pour être clair, est-il possible d'encoder ma chaîne de connexion ou la partie mot de passe de la chaîne de connexion - afin qu'elle puisse être analysée correctement?

Était-ce utile?

La solution

Les barres obliques inverses ne sont pas des caractères d'échappement valides pour les chaînes de composants d'URL. Vous devez encoder dans l'URL la partie mot de passe de la chaîne de connexion:

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

Si vous regardez l'implémentation de la classe utilisée dans SQLAlchemy pour représenter les URL de connexion à la base de données (dans sqlalchemy / engine / url.py ), vous pouvez voir qu'ils utilisent la même méthode pour échapper aux mots de passe. lors de la conversion des occurrences d'URL en chaînes et que le code d'analyse utilise la fonction complémentaire urllib.unquote_plus pour extraire le mot de passe d'une chaîne de connexion.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top