2009-09-14 5 views
15

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

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

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

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

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

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

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

+0

Можете ли вы привести пример этого специального символа, который не может быть экранирован обратным слэшем? – tuergeist

+0

отсутствует «=» после «X6 ~ k9? Q» в информации о подключении – KeyboardInterrupt

+0

, что происходит, если я убегу от него или нет – KeyboardInterrupt

ответ

30

Обратные косые черты не являются допустимыми 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 для представления адреса подключения к базе данных (в sqlalchemy/engine/url.py), вы можете увидеть, что они используют тот же метод для исключения паролей при преобразовании экземпляров URL в строки и что код разбора использует дополнительную функцию urllib.unquote_plus для извлечения пароля из строки подключения.

+0

Да, нулевое значение urlencoding. –

+7

В Python 3 'urllib.quote_plus' не существует, и вместо этого вы можете использовать [' urllib.parse.quote_plus'] (https://docs.python.org/3.1/library/urllib.parse.html#urllib. parse.quote_plus). – agold

Смежные вопросы