私が使用して、ローカルのPostgreSQLデータベースに接続するPythonスクリプトを書いた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)
このスクリプトは、PostgreSQL9.4がインストールされているマシン1で問題なく動作します。の構成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
pgAdminIIIを使用して同じデータベースに正常に接続することもできます。
同じ設定の2台目のマシンでは、スクリプトを介して接続できません。次のエラーが発生します。
psycopg2.OperationalError:FATAL:ユーザー「myappuser」の
パスワード認証に失敗しましたFATAL:ユーザー「myappuser」のパスワード認証に失敗しました
これら2つのマシンの唯一の違いは、データベースのパスワードです。だから私はそれを単純なパスワードに変更しました-そしてブーム、それは機能します。だから私はそれを複雑なものに戻しました...そしてそれは再び機能しません。パスワードは次のようなものです。
DATABASE_PASSWORD = 'zyx @ 12AA \ w2'
それで私は「これはばかげている。それは私の間違いだろう」と思った。そこで、マシン1のデータベースパスワードを2番目のマシンと同じに設定しました。そして、Pythonスクリプトも失敗します。
この場合のパスワードの円記号は、エスケープ文字として解釈されます。Pythonは、有効なエスケープシーケンスではないため、生の文字列として指定されていない場合でも、バックスラッシュ\w
をリテラルとして扱いますが、基になるライブラリもエスケープシーケンスを解析するため、バックスラッシュをエスケープ(2倍)する必要があります。\
\w
これを回避するには、代わりに接続パラメーターをキーワード引数として指定します。
psycopg2.connect(host=HOST,
database=DATABASE_NAME,
port=DATABASE_PORT,
user=DATABASE_USER,
password=DATABASE_PASSWORD)
これにより、パスワードの特殊文字に関する問題が回避されます。また、パスワードに一重引用符が含まれていると、接続文字列が壊れます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加