DBeaverでElephantSQLを使う　～PostgreSQLとElephantSQLの違い～

#はじめに
OSS-DB Silver取得に向けて学習を始めました。
DBeaverを使ってPostgreSQLを試そうと思いましたが
インストール後、「接続」でつまずいたので忘備録として残します。

**「localhost:5432への接続が拒絶されました。ホスト名とポート番号が正しいことと、postmasterがTCP/IP接続を受け付けていることを確認してください。」**
というエラーが出たのですが、解決できませんでした。

**最初の状態＝「DBeaverでPostgreSQLを使いたいけどホスト5432に接続できない。」
結論＝「DBeaverでElephantSQLを使う。」**

以下にまとめます。

#DBeaverインストール
こちらの記事に沿ってインストールしました。
「[データベースツール DBeaver のインストール（Windows 上）](https://www.kkaneko.jp/tools/win/dbeaver.html)」
(「初回起動時設定，動作確認」の項以降はPostgreSQLではなくSQLiteについて書かれていたのでスルー。）

#使い方
こちらの記事に沿って一通り使い方をさらいました。
「[SQL クライアントツール「DBeaver」が「OSqlEdit」レベルの使いやすさで感動した！！]
(https://bake0937.hatenablog.com/entry/2020/04/27/220430)」-Beeeat’s log 2020-04-27記事

#接続で難儀する
メニューバーの「postgres」を展開しようとしたら、こんなエラーが出ました。
**「localhost:5432への接続が拒絶されました。ホスト名とポート番号が正しいことと、postmasterがTCP/IP接続を受け付けていることを確認してください。」**
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/bea6056a-7dc7-16d9-3435-d32a2d64a4e8.png)

postgresのロゴマークにも赤い「×」印が出てしまいました。
DBeaverでPostgreSQLを使いたいのに、ホスト5432に接続できません。


また接続でつまずいてしまいました。pgAdmin、vagrantでもそうでしたが、この「接続/認証」で詰まりがちです。ポートのことをしっかり理解&把握できていないのが要因なのか？

**ポート番号とは：**
>TCP/IP通信においては、 IPアドレスがあればネットワーク上のコンピュータを一意に識別することができますが、 該当コンピュータのどのプログラムに通信パケットを届けるかは、 IPアドレスだけでは決定できません。 どのプログラムに通信パケットを渡すのかを決定するために、 ポート番号を使用します。
（引用：[ポート番号とは](https://www.nic.ad.jp/ja/basics/terms/port-number.html)）


一つ一つ確認します。

##ホスト名とポート番号は正しいか？
→メニューバーのpostgresを右クリック→「編集　接続」をクリック→出た画面がこちら。

**(図1)**
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/37aded29-7a0d-3bb7-b147-7d657dcd3c6d.png)
→ホスト名もポート番号もデフォルトのままです。正しいってことでOKなのかな？

##postmasterがTCP/IP接続を受け付けていることを確認する
→postmasterとは？：PostgreSQLのマルチユーザデータベースサーバ（引用：[PostgreSQL 7.2.3 リファレンスマニュアル](https://www.postgresql.jp/document/7.2/reference/app-postmaster.html)）
→TCP/IP接続とは？：いまいち実態がつかめないけれど、端末と接続するということかな？
→この接続を受け付けてもらえていない状態...ということか？
→これをどうやって「受け付けてもらえる状態」にすれば良いの？
→検索すると、「postgresql.conf」等の「~.conf」ファイルを修正する方法が有効らしい。が、それらはCUIで操作されている。GUIであるDBeaverでも同操作は可能なのか？そもそも自分のホストPCで「conf」を検索しても、そのようなファイルは検出されない。ホストPCにPostgreSQLを導入したわけじゃないからかなあ。あくまでDBeaver上で操作しようとしているだけだもんね。
→PC再起動&Wifi再接続という方法もあるらしいので、やってみる。
→状況変わらず。同じエラーが出る。
→いったんPostgreSQLをDBeaverから削除し、改めて「新しい接続」でPostgreSQLを選択し、デフォルトの状態のまま「テスト接続」→同じエラーが出た。
→DBeaverをホストPCからアンインストールしてみる。(WinマークをクリックしてDBeaver上で右クリックし「アンインストール」を選択し、あとは指示に従いアンインストール完了。
→再インストールしPostgreSQLと接続→同じエラーが出て接続できず。

なーーーんーーーでーーーっっ！！！！

##ファイアーウォールがポート番号5432をブロックしていないか？
今ブロックされているかどうかは不明ですが、
こちらの記事「[Windows10 - ファイアウォール - 特定のポート番号の通信を許可](https://pc-karuma.net/windows-10-firewall-open-port/)」を参考に、5432をブロックしないように設定します。

(この記事、「ファイアウォールを無効/有効に」「Windows10 - ファイアウォールを既定値（デフォルト）に戻す」についての記事へのリンクも貼ってありました。設定を訂正したいときは読みたいと思います。）

設定後、再度「編集　接続」で「テスト接続」をクリックしましたが、やはり同じエラーが出て接続できません。

##ホストを「localhost」から「127.0.0.1」に変えてみる
「ローカルにPostgreSQLをインストールしており、接続設定を変更していない場合、127.0.0.1のままになっていると思われます。」という[記事](https://syslog.life/2020/12/14/dbeaver-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB-postgresql-%E6%8E%A5%E7%B6%9A/#DBeaver_%E8%B5%B7%E5%8B%95)を見つけました。私のPCにはPostgreSQLは入っていないけど、ダメもとで「127.0.0.1」に変更して「テスト接続」をクリック→同じエラー。失敗。

##ホストを「localhost」から「自分のホストPCのIPアドレス」に変えてみる
コマンドプロンプトで「ipconfig」と入力し、PCのIPアドレスを確認し、入力
→同じエラー。失敗。

#結局解決せず
解決しませんでした。なぜ・・・。
やはりpgAdminを使うか。
以前Tera Termやvagrantでも「接続」の部分でつまずいたので、「接続」をスムーズに完了させることが今の自分の課題です

#師匠からのアドバイス
師匠に行き詰っている状況を報告したところ、「ホストが間違っている」と指摘いただきました。

・・・！？？？？
ホストが違う！？？？？

以下、師匠からの助言。
>ホストが間違ってる。。。
そもそもローカルではなく、リモート先のエレファントに繋がないと、、、
繋ぐDBが存在するのはローカル(自分のPC)ではなくリモート(クラウドのエレファント)でしょ
一旦図で整理した方がいい。何がローカルかリモートか？ DBはどっちか？という観点で

>ここポート番号を除き全部間違ってる
(「[ホスト名とポート番号は正しいか？]()」の図1を指して)

>そもそもエレファントを使うのか？ホストpcにポスグレインストールして使うのどっちをしたいの？
ホストは汚さない方が良いから一旦エレファントを使う方向性のハズ
でも、ホストの起動してないポスグレに繋ごうとしてる

>一度ローカルホストのポスグレの事は忘れるべし。だから、直接インストールは初心者はやめた方が良いと言ってるのよ。わけわからなくなるから

>ちなみに今想定内の一番やっちゃイケナイ泥沼パターンです。いっそローカルのポスグレは有ると悪さをするのでアンインストールした方が良い
情報を減らさないと理解ができないと思うよ

>何故前回pgadminで途中まで出来てた事が今回間違ったかという観点で振り返った方がいいと思う
こんかいのは特に5w1hのwhereの理解が浅そう
イメージを図で明確にすれば根本的なミスは解決できると思う。

こう指摘されて、自分の認識がかなりずれていることに気づきました。

<これまでの私の認識> 
・DBeaverでPostgreSQLを操作するつもりだった。 
DBeaverでクラウド上のPostgreSQLに「このPCに繋がってください」というメッセージを送り、クラウド上のPostgreSQLが、DBeaverを介して私のPCのポート番号5432に繋がるというイメージをしていた。「私のPCにインストールしたDBeaver」が、「私のPCのポート5432に繋がったPostgreSQL」とタッグを組んで働くイメージ。 
・pgAdminでElephantSQLを操作するつもりだった。 
「私のPCにインストールしたpgAdmin」が「クラウド上のElephantSQL」ちタッグを組んで働くイメージ。 

<師匠に助言を受けてからの認識>
 ・pgAdminでもDBeaverでもElephantSQLを操作できる。「DBeaverでPostgreSQLを使う」ことを目的にしていたけれど、「DBeaverでElephantSQLを使う」ことを目的にする！

 <何故前回pgadminで途中まで出来てた事が今回間違ったか> 
・<これまでの認識>に書いた通り、DBeaverの仕組みについて、勝手に変なイメージをしていたことが原因。しかも接続を試みる作業中は、上記のイメージを言語化、図化できておらず、ぼやっとしたイメージのみで作業を進めていた事がいけなかった。自分の認識していることを、しっかり整理して図化する必要があった。そうすれば自分の認識と事実のズレにいずれ気づけるはず。

#仕切り直し。PlstgreSQLとElephantSQLの違いは何か？
そもそもになってしまいますが、私、「PostgreSQL」と「ElephantSQL」の違いをしっかり理解していないことに気づきました。
本当を言えば序盤で違いがわかっていないという事実に気づいて「PostgreSQL ElephantSQL　違い」等でググって調べたり、ElephantSQLの解説を探したりしたものの、すぐに目的に合った情報にたどり着けなかったことから、自分のその疑問に目をつぶっていました。 目をつぶってはいけなかった・・・。

整理します。

**PostgreSQL**＝オブジェクトリレーショナルデータベース管理システム（ORDBMS）。オープンソースのリレーショナルデータベース管理システム（RDBMS）。RDBMSは、RDBをコンピュータ上で操作できるようにした管理システム。

**ElephantSQL**＝クラウドでPostgreSQLを使えるサービス。クラウド上のサーバーPCにElephantSQLの運営がインストール、設定してくれて直ぐに手軽に使えるモノ →なので自分自身のPCや自分が用意したクラウドサーバーにインストール・設定が不要。

**今からやりたいこと**＝「自分のPCにインストールしたDBeaver」から「クラウド上にあるDB＝ElephantSQL」にアクセスし、DBeaverでElephantSQLを操作する。

#おわりに
結局、最初にPostgreSQLとElephantの違い、そして「DBeaver（自分のPCにインストールして使う）」「PostgreSQL（自分のPCにインストールして使う）」「ElephantSQL（クラウド上で使う）」がそれぞれ「どこに」存在するのか（自分のPC or クラウド）をしっかり理解していなかったのが、迷走の原因でした。
師匠の助言を受けて、一度紙に図としてその所在を書き出したことで、頭の中が整理されました。
今後は、自分が扱おうとしているものは「どこに」あるものなのか、使う「目的」は何なのか、わからなくなったら立ち止まって整理するようにします。

次は、DBeaverでElephantSQLを触ってみます。

次＝
「[DBeaverでElephantSQLに接続](https://qiita.com/ume-san/items/92f667c525d49402ff33)」
「[DBeaverでElephantSQL(PostgreSQL)を操作してみる](https://qiita.com/ume-san/items/4e635ac2b18e3079744b)」