Написание строки подключения, когда пароль содержит специальные символы

Я использую SQLalchemy для проекта Python, и я хочу иметь аккуратную строку соединения для доступа к моей базе данных. Так, например:

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

Проблема заключается в том, что мой пароль содержит последовательность специальных символов, которые интерпретируются как разделители при попытке подключения.

Я понимаю, что могу просто создать объект, а затем передать мои учетные данные следующим образом:

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

Но я бы скорее использовал строку соединения, если это возможно.

Итак, ясно, можно ли кодировать мою строку подключения или часть пароля строки подключения, чтобы ее можно было правильно разобрать?

Ответы

Ответ 1

Обратные косые черты не являются допустимыми escape-символами для строк URL-адреса. Вам необходимо URL-кодировать часть пароля строки подключения:

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

Если вы посмотрите на реализацию класса, используемого в SQLAlchemy для представления URL-адресов для подключения к базе данных (в sqlalchemy/engine/url.py), вы увидите, что они используют один и тот же метод для исключения паролей при преобразовании экземпляров URL в строки и что код разбора использует дополнительную функцию urllib.unquote_plus для извлечения пароля из строки подключения.