質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

5427閲覧

Python3 同じネットワークにあるPCのpostgresqlに接続できない

person

総合スコア223

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/02/21 01:34

編集2022/03/11 17:28

同じネットワークにあるPCのpostgresqlに接続できません。
どういった対応が必要か回答お願いします。

ホスト側(postgresqlインストールPC)

192.168.0.100

C:\Users\USER>psql -V psql (PostgreSQL) 14.1

クライアント側

192.168.0.10

実行コード(ホスト側PCで動かしたら接続できましたが、クライアント側ではエラー。ただし、ホスト側で動かしたときは host = "localhost" にしてました。)

Python

1from datetime import datetime 2 3import psycopg2 4 5table = "testtb" 6 7def cnct(): 8 try: 9 con = psycopg2.connect( 10 host = "192.168.0.100", 11 port = 5432, 12 user = "postgres", 13 password = "root", 14 dbname = "postgres", 15 connect_timeout = 10 16 ) 17 cur = con.cursor() 18 print("<< cnct current >>") 19 return con, cur 20 except Exception as e: 21 print("<< cnct error >>") 22 print("type(e): {}".format(type(e))) 23 print("e: {}".format(e)) 24 return None 25 26 27def discnct(con, cur): 28 try: 29 cur.close() 30 con.close() 31 print("<< discnct current >>") 32 except Exception as e: 33 print("<< discnct error >>") 34 print("type(e): {}".format(type(e))) 35 print("e: {}".format(e)) 36 37 38def select(sql): 39 try: 40 cur.execute(sql) 41 results = cur.fetchall() 42 print("<< select current >>") 43 return results 44 except Exception as e: 45 print("<< select error >>") 46 print("type(e): {}".format(type(e))) 47 print("e: {}".format(e)) 48 return None 49 50 51if __name__ == "__main__": 52 # cnct 53 cnct_info = cnct() 54 if cnct_info: 55 con, cur = cnct_info 56 57 # select 58 results = select("SELECT * FROM testtb;") 59 if results: 60 for i in results: 61 print(i) 62 63 # discnct 64 discnct(con, cur)

確認したこと

下記を参考に、ホスト側のPostgreSQLの設定ファイルを確認したが、
pg_hba.confのmethodがmd5ではなくscram-sha-256となっていること以外は、
サイトの内容と同じだった。
【PostgreSQL】他のPCから接続する設定を解説します(Windows)

試したこと

下記を参考に、WindowsDefenderファイアーウォールの受信規則追加。
PostgreSQL へ他の端末から接続するための設定

エラー

WindowsDefenderファイアーウォールの受信規則追加前の結果

<< cnct error >> type(e): <class 'psycopg2.OperationalError'> e: connection to server at "192.168.0.100", port 5432 failed: timeout expired

WindowsDefenderファイアーウォールの受信規則追加した際の結果

<< cnct error >> type(e): <class 'psycopg2.OperationalError'> e: connection to server at "192.168.0.100", port 5432 failed: FATAL: no pg_hba.conf entry for host "192.168.0.10", user "postgres", database "postgres", no encryption

追記

pg_hba.confに下記最下行を追記したらクライアント側から接続できました。
しかし、この方法だと受け入れるPCを都度入れる必要がありそうですが、すべてのPCから受け入れるようにするにはどうすればよいでしょうか。
アドレスの部分に"*"とか入れてみましたが、could not load pg_hba.confなどとエラーが返されてしまいました。

pg_hba.conf

1# IPv4 local connections: 2host all all 127.0.0.1/32 scram-sha-256 3host all all 192.168.0.10/32 trust

(192.168.0.10/32と記述して接続できましたが、ホスト側のコマンドプロンプトでサブネットマスク確認したら 255.255.255.0 だったので、CIDR表記として正しいのは 192.168.0.10/24 でした。192.168.0.10/24を記述しても接続できたので、192.168.0.10/24と記述することにします。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

person

2022/02/21 01:50 編集

当初の質問の対処方法は、質問文に追記した内容で解決しました。 しかし、この方法について疑問が生じたため、追記内容に対しての回答お願いします。
person

2022/02/21 06:00 編集

そう訊かれると自信ないです。 ドキュメントの例見ると、一番上のallでいいのでしょうか。 一応アドレスを192.168.0.10/24からallに変更したら、192.168.0.10からの接続はできました。
guest

回答1

0

ベストアンサー

どこからでも接続できるようにしたいのであれば、pg_hba.confを以下のようにしたらどこからでも接続できます。

pg_hba.conf

1host all all 0.0.0.0/0 md5

あまりおすすめはしませんが。

投稿2022/03/11 03:01

Kawachan99

総合スコア114

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

person

2022/03/11 07:15 編集

どこからでもというのは、インターネットに接続した全てのデバイスからでもということですか? それともローカルネットワーク内ですか?
Kawachan99

2022/03/11 08:21

それはpostgresql.confの設定によります。 localhostだけの設定の場合は外部は一切通しませんが、おそらくローカルでする場合はめんどくさいので全部通す設定にしてあるので、結論は全部通してしまうことになります。ですが、md5を使うのであれば特に開発程度でしたら特に問題ありません。もし、プライベートだけを通したいのでしたら接続する側のプライベートIPを固定にしたらよろしいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問