質問: _connect(dsn, connection_factory=connection_factory, async=async) psycopg2.OperationalError: could not connect to server: Connection refused (0x0000274D/10061) Is the server running on host "localhost" (::1) and accepting TCP/IP connections on port 5432? could not connect to server: Connection refused (0x0000274D/10061) Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432?
回答: チェックポイントは2点あります。 1. PostgreSQLが正常に起動されていることを確認する。 コマンドプロンプトで "netstat -anp tcp" を実行し、ローカルアドレスが "0.0.0.0:5432" で状態が "LISTENING" になっているソケットがあることを確認する。これが存在していない場合、PostgreSQLが起動されていないと考えられます。 2. PostgreSQL の接続受け入れインターフェースを確認する。 postgresql.conf ファイルの listen_addresses の記述がどのようになっているか確認しましょう。 listen_addresses=の後ろには、クライアントアプリケーションからの接続要求の受け入れを許可するネットワークインターフェースのIPアドレスが記載されています。(複数エントリーはカンマ区切り) 基本的にはここに 127.0.0.1(IPv4のローカルホストアドレス) と ::1(IPv6のローカルホストアドレス) が含まれている必要があります。 同じPC上で動作するPythonアプリケーションからの接続だけを許可し、他のPCからの接続を禁止する場合、listen_addresses=::1,127.0.0.1 とに定義します。 なお、すべてのネットワークインターフェースに対して接続受け入れを許可する場合、 listen_addresses=* と定義することができます。 ご参考になれば。 ### (追記)検証手順 #1 - PostgreSql の動作確認 1. psql にユーザー'postgres'でログインする(Databaseは既定の 'postgres' にする) 2. `\l` でデータベース名の一覧を得る。ここに 'pdb' というデータベースが存在している場合、4へ進む。 3. 上記で 'pdb' が存在していない場合、 `create database pdb;` を実行。("CREATE DATABASE"と表示されれば成功) 4. `\connect pdb;` を実行し、現在のデータベースを pdb に変更。(プロンプトが "pdb=#" になる) 5. テスト用のテーブルを作成。`CREATE TABLE test (id serial PRIMARY KEY, age integer, name varchar);` ("CREATE TABLE"と表示されればOK) 6. `\d test;` を実行し、テーブルが正しく作成されたことを確認。(id, age, nameなどの列名と定義が表示されればOK) 7. `insert into test (age, name) values (20, 'Taro');` で一行追加。 8. `select * from test;` でデータを取得。(上記で追加した内容が表示されればOK) 上記が問題ない場合、PostgreSqlのインストールと設定は正常だと思います。 ### (追記)検証手順 #2 - Python+Psycopg2 の動作確認 1. Python(Command line)を起動し、Pythonプロンプトに対して以下を実行する。 2. `>>> import psycopg2` 3. `>>> db=psycopg2.connect(database="pdb", host="localhost", user="postgres", password="postgresのパスワード")` 4. `>>> cursor=db.cursor()` 5. `>>> cursor.execute("select * from test;")` (この行が抜けてました!) 6. `>>> cursor.fetchone()` (ここで検証手順 #1 で追加したデータが表示されればOK) 7. `>>> cursor.close()` 8. `>>> db.close()` 恐らく上記のどこかで失敗するのではないかと思います。 もし、これらの手順がすべて成功する場合、現在のスクリプトファイルの内容が、(転記ミスなどにより)質問欄に書かれている内容と違っている可能性が高いと思います。