密码验证失败,密码复杂

时间:2015-02-18 17:18:10

标签: python postgresql passwords psycopg2

我写了一个Python脚本,它使用 psycopg2 2.6 Python 2.7.8 连接到本地PostgreSQL数据库。连接设置和命令如下:

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)

该脚本在安装了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 成功连接到同一个数据库。

问题

在具有相同设置的第二台机器上,我无法通过脚本连接。发生以下错误:

  

psycopg2.OperationalError:致命错误:用户“myappuser”的密码验证失败   致命:用户“myappuser”

的密码验证失败

这两台计算机之间唯一的差异数据库密码。所以我把它改成了一个简单的密码 - 繁荣,它的工作原理。所以我把它改回了一个复杂的......它确实再次工作。密码是这样的:

  

DATABASE_PASSWORD ='zyx @ 12AA \ w2'

所以我想:“这是愚蠢的。这一定是我的错。”所以我将机器上的数据库密码设置为与第二台机器上的相同。并且呐喊Python脚本也失败

1 个答案:

答案 0 :(得分:4)

在这种情况下,密码中的反斜杠被解释为转义字符。 Python会将\w中的反斜杠视为文字\,即使它未被指定为原始字符串,因为\w不是有效的转义序列,但底层库也parses escape sequences因此反斜杠必须被转义(加倍)。

要避免这种情况,请改为指定连接参数as keyword arguments

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

这可以避免密码中的特殊字符出现问题。密码中的单引号chacacter也会破坏连接字符串。