Delphi / FireDAC　から　PostgreSQL12に接続

この記事は『 Delphi Advent Calendar 2019』の16日目のエントリとなります。

###はじめに
　PostgreSQL12用の外部接続用(オンプレ接続)の環境構築を行います。

　サーバーOSは、CentOS7(64bit)、PostgreSQLは最新の12(64bit)を　yumでインストール　します。
　(残念ながら、Linux用GUIインストーラーは10でリリースがストップされたようで、Windows版インストーラーも32bitは、10で同様に、ストップされています。
　https://www.enterprisedb.com/ja/downloads/postgres-postgresql-downloads
![edb_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/c5c5e12e-f5d0-74f8-b520-c1574b9e02b7.png)
なので、12用の　32bit　dll　は pgAdmin4から取得します、
　また　12用の　64bit　dll　は Windows10にインストールしたPostgreSQL12から取得するようにします、

　クライアントはWindows10 + Delphi10.2で実行しました。

　ローカルプライベートアドレス　は、192.168.24.xxx 　で書き進めます、使用されるアドレスが異なる場合(クラウドサービスなどで試す場合、エンドポイントとなります)は、ご自身で構築できるアドレスクラスで読み替えてお試しいただければと思います。

　
#作業手順
###サーバー側
**(1)　CentOS7をローカル機にインストールします**
　(CUIベースのインストールでもオッケーですが、ローカル機の場合、gnome GUIでインストールもらうと作業が楽です)

**(2)　PostgreSQL12のインストール**
　ここに、　https://www.postgresql.org/download/linux/redhat/
　インストール手順が掲載されています確認します、(他のバージョン/プラットフォームの選択も可能です)
![redhat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/8995906c-f3e8-025b-212b-0d8087ae94da.png)
　1.Select version:(バージョン選択：)　

```
12
```

　2.Select platform:(プラットフォーム選択：)

```
　RedHat Enterprise,CentOS,Scientific or Oracle version 7
```

　3.Select architecture:(アーキテクチャ選択：12はx86_64のみです)

```
　x86_64
```

　4.Install the repository RPM:(RPMのリポジトリをインストール)<この行以下はコマンド入力します>

```
　yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
```
<上のコマンドを1行実行した実際の画面は、こんな感じです>
![Screenshot from 2019-12-09 13-00-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/a0f00e62-d242-2cc8-615f-050354e3473b.png)

　5.Install the client packages:(クライアントパッケージをインストール)

```
yum install postgresql12
```
<上のコマンドを1行実行した実際の画面は、こんな感じです>
![yum_pg12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/450c7688-aa01-d4fa-1007-3371dcfc085c.png)
　6.Optionally install the server packages:(サーバーパッケージをインストール)

```
　yum install postgresql12-server
```

　7.Optionally initialize the database and enable automatic start:(データベースを初期化し、自動起動を有効)

```
　/usr/pgsql-12/bin/postgresql-12-setup initdb
　systemctl enable postgresql-12
　systemctl start postgresql-12
```

<上のコマンド実行した実際の画面は、こんな感じです>
![Screenshot from 2019-12-15 12-04-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/6ebfcb1a-23b7-263a-7873-452016501f62.png)



--------　注)　ロケールC　を選択したい場合は --------　

```
　PGSETUP_INITDB_OPTIONS="-E UTF8 --locale=C" /usr/pgsql-12/bin/postgresql-12-setup initdb
　systemctl enable postgresql-12
　systemctl start postgresql-12
```

----------------　　注)　とします 　　----------------　

**(3)　PostgreSQLのデータベースにアクセスする、バスワードを設定します**

```
　su postgres
　psql
　\l
　alter role postgres with password 'dbPasswd123';
　create database testdb1;
　\q
　exit
```

<上のコマンド実行した実際の画面は、こんな感じです>
![Screenshot from 2019-12-15 12-13-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/9d7f7537-f032-03bb-efa2-1e367f3f1dc4.png)

　(これで、ユーザー　postgres　パスワード　dbPasswd123　で　testdb1 に接続します)
　(ユーザー　postgres　は、Firebirdの　SYSDBA　MS SQL Serverの　sa のようなスーパーユーザーに当たります)

**alter role postgres with password 'dbPasswd123';**
が
PostgreSQLのGUIインストールだと、ここの処理に該当します。
![08_pass2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/b80b25f8-4010-3a5a-b021-b0a96000bfb0.png)

**(4)　PostgreSQLの外部からの接続許可**
　pg_hba.conf
　postgresql.conf　の2つファイルをエディタで編集します。
CUI　は　vi /var/lib/pgsql/12/data/pg_hba.conf　となりますが、gnome GUIの場合
は gedit で、Windowsのメモ帳のような編集が可能です。

```
gedit /var/lib/pgsql/12/data/pg_hba.conf　
```
![pg_hbaconf1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/72d46672-d4ad-71b2-f7da-96ec5cdae02e.png)
今回は、192.168.24.0 サブネットマスク 255.255.255.0　で認証をmd5とするため
host  all all 192.168.24.0/24  md5　
を追記して保存します、
<geditの画面はこんな感じです>
![pg_hbaconf2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/3134ad46-fcac-c8e8-26f7-1de4cb9aed82.png)
geditの場合は、このままpostgresql.confも追加で編集ができます。
![pg_hbaconf3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/0b69b7d5-533a-77fc-87da-234b39f729f3.png)
コメントの　#　を外して
listen_address='*'
port=5432
として保存します。

**(5)　OSのファイアウォール設定**
　1. Firewallの設定 5432 port をopenします

```
　firewall-cmd --add-port=5432/tcp --zone=public --permanent
```
　2. Firewall を再起動

```
　firewall-cmd --reload     
```

　3. **PostgreSQL を再起動**

```
　systemctl restart postgresql-12
```

　4.ipアドレスを確認する

```
　ifconfig
```

<ifconfigコマンド実行した画面は、こんな感じです>![ifconfig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/b18856b2-72fc-81c3-6037-a2fdd865ea25.png)

　これで、このPostgreSQLサーバーに外部から 192.168.24.64 に、ユーザー　postgres　パスワード　dbPasswd123　で接続可能となります。

---

###ここからクライアント側の手順
注)pgAdmin4とPostgreSQL12(64bit)Windows版をインストールする手順を書きますが、開発用のとは別のマシンで、行ってもらったほうが、わかりやすいかもしれません、実行される場合は、手順を先にご覧になってご自身の環境でよい方法をお試しください。

**(6)　pgAdmin4をインストールして接続確認とDLLの取得**
https://www.pgadmin.org/download/pgadmin-4-windows/
![pgadmin4-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/f83472d2-0345-6e79-6f7b-222bb5ee5a91.png)
最新をダウンロードしましょう、pgAdmin 4 は　.16 　などマイナーバージョンが頻繁にアッフデートされます。
pgAdmin 4 のバージョンとPostgreSQLのバージョン番号は合致していません、.15以降がたぶん　PostgreSQL12に対応していたと思います。
pgadmin-4をインストールしたら、
C:\Program Files (x86)\pgAdmin 4\v4\runtime　に　dll　があります、
![pgadmin4-dll_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/af64cafe-9521-6bc9-3df6-9b1c5f122d64.png)
pg_dumpなどを使用する場合は、一緒にコピーします。(v16では、v15に゜あった　SSL用?の　libeay32.dll　/　ssleay32.dllが入ってないので。必要な方はv15から取得してください)

libpq.dll　は　32bit / 64bit ともに同名ですが、こちらは、32bit　です。
[確認方法の参考:　EXEやDLLが32bitなのか64ビットなのか確認する方法としては、apec　というツールを使用できます](https://bitbucket.org/yamorijp/apec/wiki/Home)
　pgAdmin4で接続できない場合は、上記のいずれかの設定が間違っている可能性があります、FireDACからも接続は不可となります。

**(7)　PostgreSQL12をインストールして、64bit版dllを取得**
C:\Program Files\PostgreSQL\12\bin　から
![20_bin2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/137730e8-d750-da9e-996c-871a2a80bb4d.png)
を取得、pg_dumpなどを使用する場合は、一緒にコピーしてよいでしょう。
PostgreSQL12をインストールマシンからは、ローカル/外部ともに接続は可能になります。
　
**(8)　Delphiからの接続**
　FireDACで接続
　取得したDLL　を配置して、実行します。
[この画面のサンプルコードとDLLは、こちらに置いておきます、](http://a23.sblo.jp/article/186918494.html?1576308187)
EXEも同梱していますので60MBほどありますが、ご興味のある方は、ダウンロードしてお試しください。
![delphi10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/430b7b98-a24d-3b19-97c3-11240c8933ac.png)


**(9)　まとめ**
　PostgreSQL11以降、32bit版のWindowsインストーラーがなくなったので、新しい32bitのDLLの入手方法が不明で、自分の困ったことと、解決方法をまとめてみました。(解決方法としては、もっとスマートな方法も存在するのかもしれません)

　今回の内容がPostgreSQLに偏りましたが、環境構築できないと、Delphiからは試すことはできませんので、PostgreSQLの入門を試みる方の実行の参考になれば幸いです。

　(12/08時点で、サイトhttps://www.postgresql.org/download/linux/redhat/の手順では、エラーとなりましたので、CentOS7で行いました)

　CentOS8用はサイトの手順が少し追加もしくは、変更が必要なようで、
　[ここにメモしました](http://a23.sblo.jp/article/186893843.html)

[PostgreSQLをインストールするのに抵抗のある方は、ポータブル版というのもありますが、現時点ではv10です](https://sourceforge.net/projects/postgresqlportable/files/)

---
PostgeSQLの情報や質問は、slackのpostgresql-jpの　beginners　から始めることができます。
https://app.slack.com/client/T0AM3AQAH