Pregunta

Estoy usando SQLalchemy para un proyecto de Python, y quiero tener una cadena de conexión ordenada para acceder a mi base de datos. Entonces, por ejemplo:

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

El problema es que mi contraseña contiene una secuencia de caracteres especiales que se interpretan como delimitadores cuando intento conectarme.

Me doy cuenta de que podría crear un objeto y luego pasar mis credenciales de esta manera:

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

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

Entonces, para ser claros, ¿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?

¿Fue útil?

Solución

Las barras invertidas no son caracteres de escape válidos para las cadenas de componentes URL. Necesita codificar en URL la parte 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:%s@host/database' % urlquote('badpass'))

Si observa la implementación de la clase utilizada en SQLAlchemy para representar las URL de conexión de la base de datos (en sqlalchemy / engine / url.py ), puede ver que usan el mismo método para escapar de las 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top