2009-09-14 23 views
15

Estoy usando SQLalchemy para un proyecto de Python, y quiero tener una cadena de conexión ordenada para acceder a mi base de datos. Así, por ejemplo:Escribir una cadena de conexión cuando la contraseña contiene caracteres especiales

engine = create_engine('postgres://user:[email protected]/database') 

El problema es mi contraseña contiene una secuencia de caracteres especiales que consiguen interpretados como delimitadores cuando intento conectar.

que se dan cuenta de que sólo podía crear un objeto y luego pasar mis credenciales como esto:

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

Pero yo preferiría utilizar una cadena de conexión si esto es posible.

Para que quede claro, ¿es posible codificar mi cadena de conexión o la parte de contraseña de la cadena de conexión para que pueda analizarse correctamente?

+0

¿Puedes dar un ejemplo de este char especial que no se puede escapar con una barra diagonal inversa? – tuergeist

+0

falta "=" después de "X6 ~ k9? Q" en la información de conexión – KeyboardInterrupt

+0

que ocurre ya sea que lo escape o no – KeyboardInterrupt

Respuesta

30

Las barras diagonales inversas no son caracteres de escape válidos para las cadenas de componentes URL. Es necesario para cifrar la URL de la porción de la contraseña de la cadena de conexión:

from urllib import quote_plus as urlquote 
from sqlalchemy.engine import create_engine 
engine = create_engine('postgres://user:%[email protected]/database' % urlquote('badpass')) 

Si nos fijamos en la implementación de la clase utilizada en SQLAlchemy para representar las direcciones URL de conexión de base de datos (en sqlalchemy/engine/url.py), se puede ver que el uso del mismo método para escapar contraseñas al convertir las instancias de URL en cadenas, y que el código de análisis utiliza la función complementaria urllib.unquote_plus para extraer la contraseña de una cadena de conexión.

+0

Sí, urlencoding es lo que se necesita. –

+7

En Python 3 'urllib.quote_plus' no existe, y en su lugar puede usar [' urllib.parse.quote_plus'] (https://docs.python.org/3.1/library/urllib.parse.html#urllib. parse.quote_plus). – agold

Cuestiones relacionadas