Ошибка аутентификации пароля с помощью сложного пароля

Я написал Python script, который подключается к локальной базе PostgreSQL, используя psycopg2 2.6 и Python 2.7.8. Параметры подключения и команды следующие:

HOST = '127.0.0.1'
DATABASE_NAME = 'myappdatabase'
DATABASE_PORT = '5432'
DATABASE_USER = 'myappuser'
DATABASE_PASSWORD = 'secret'
DATABASE_TABLE = 'myappdata'

def _database_connection():
    conn_string = "host='{0}' dbname='{1}' port='{2}' user='{3}' \
        password='{4}'".format(HOST, DATABASE_NAME, DATABASE_PORT, \
        DATABASE_USER, DATABASE_PASSWORD)
    return psycopg2.connect(conn_string)

script работает без проблем на машине, на которой установлен PostgreSQL 9.4. Конфигурация в sudo vi /etc/postgresql/9.4/main/pg_hba.conf не изменяется и выглядит следующим образом: без комментариев:

local   all             postgres                                peer
local   all             all                                     peer
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5

Я также могу успешно подключиться к одной базе данных с помощью pgAdmin III.

Проблема

На второй машине с той же настройкой я не могу подключиться через script. Произошла следующая ошибка:

psycopg2.OperationalError: FATAL: аутентификация пароля для пользователя "myappuser"
FATAL: аутентификация паролей для пользователя "myappuser"

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

DATABASE_PASSWORD = 'zyx @12AA\w2'

Поэтому я подумал: "Это глупо. Должно быть, это моя ошибка". Поэтому я устанавливаю пароль базы данных на машине один на тот же, что и на второй машине. И кричать на Python script также не удается.

Ответ 1

Обратная косая черта в этом пароле интерпретируется как escape-символ. Python будет обрабатывать обратную косую черту в \w как литерал \, даже если он не указан как необработанная строка, потому что \w не является допустимой escape-последовательностью, но базовая библиотека также анализирует escape-последовательности, поэтому обратная косая черта должна быть экранирована (удваивается).

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

psycopg2.connect(host=HOST,
                 database=DATABASE_NAME,
                 port=DATABASE_PORT,
                 user=DATABASE_USER,
                 password=DATABASE_PASSWORD)

Это позволяет избежать проблем со специальными символами в паролях. Кроме того, один пароль chacacter в пароле разбивает строку соединения.