Написание строки подключения, когда пароль содержит специальные символы
Я использую 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
для извлечения пароля из строки подключения.