[OutSystems]Heroku Postgresを使って外部DB機能を無料で試してみる

:::note warn
Herokuのフリープランは廃止されるようです。よってこの記事で紹介した方法は無料ではできなくなります。以下のFAQ参照。
https://help.heroku.com/RSBRUH58/removal-of-heroku-free-product-plans-faq
:::

OutSystemsにおいて、外部DBとは、プラットフォームとは別に（外部に）あるDataBaseに接続し、そのデータをEntityを通して操作するもの。
個人的な経験的には、多くのユーザー企業で使われている。

ただ、Personal Environmentでこの機能の動作確認をするには、インターネット上でRDBをホストしてくれるサービスが必要で、だいたい有料。
最近、Heroku Postgresを使うと、PostgreSQLのデータベースを無料で用意できることに気づいたので、データベース作成からExtension作成・利用までの手順をまとめてみる。

# 環境
Personal Environment(Version 11.16.0 (Build 35766))
Service Studio(Version 11.53.7)
Integration Studio(Version 11.11.5)
pgAdmin4(Version 6.11)

# Heroku Postgresのデータベースを用意する
[How to set up a free PostgreSQL database on Heroku](https://dev.to/prisma/how-to-setup-a-free-postgresql-database-on-heroku-1dc1)にスクリーンショット付きで手順が載っている。

1. [Herokuのアカウントを作る (Sign Upのリンクから）](https://id.heroku.com/login)
1. ログイン
1. 「Create new app」ボタンでappを作る
1. 作ったappを開き、Resourcesタブ > Add-ons欄で「Heroku Postgres」で検索して、Freeと書かれているプランを選択してProvision

Freeのオプションで作ってみたところクレジットカードは不要だった。
ここまででもうPostgreSQLのデータベースはできている。

# データベースにテスト用Tableを作成する
データベースを操作するのにHerokuのCLIを使う方法と、PostgreSQLを操作するツールを使う方法があるらしい。
後者の方が簡単そうだったので、pgAdmin4をダウンロード、インストール。
私はWindowsを使っているので、https://www.pgadmin.org/download/pgadmin-4-windows/
からダウンロードした。

## pgAdmin4でデータベースに接続する
pgAdmin4を起動すると、最初にMaster Passwordを設定するダイアログが出てくる。
これをCancelして後続の作業をしていたら、「crypto key missing」というエラーが出て接続できない問題が発生したので、恐らく設定しておいたほうが良い。

接続先情報を指定するため、DashboardにあるAdd New Serverをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/377a1a3e-ccd8-0a48-042a-b341b4b9c6a7.png)

Register - Serverダイアログ（正しい設定かどうかまでは分からないが、この設定で動作確認はできた）
- Generalタブ > Nameプロパティ：接続につける適当な名前（ここではheroku_testとした）
- Connectionタブ > (Heroku PostgresのDatabaseページ > Settingsタブ > Database Credentialsセクションからコピー）
    - Host name/address：Database CredentialsセクションのHost
    - Port：Database CredentialsセクションのPort
    - Maintenance database：Database CredentialsセクションのDatabase
    - Username：Database CredentialsセクションのUser
    - Password：Database CredentialsセクションのPassword
- SSLタブ > SSL mode：Prefer

最後にSaveボタンをクリックして保存。

Heroku PostgresのDatabaseページ > Settingsタブ > Database Credentialsセクションの項目は以下の色を付けた位置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/cd55711d-4dc1-4e45-f42f-82b7e1b89e08.png)

## テーブルを作る
画面左のサイドバーのServers、先程定義した接続情報を展開すると、該当位置にあるDatabaseの一覧が表示される。
自分の環境で展開すると7000ほどのDatabaseが表示された。恐らく、共有の環境であるため、他のユーザーのDatabaseが表示されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/721b9d5f-f85c-0656-f908-23deb0fafb49.png)

接続情報で指定したのと同じ名前のDatabase > Schemas > public > Tablesを選択し、右クリック > Create > Table...でテーブルを作成する。
下のスクリーンショットでは、「PgTestTable」という名前で作っている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/c630bc84-8a81-f220-1979-e6e6fe7e6527.png)


テーブルの定義例。OutSystemsのEntityは主キーがInteger/Long Integerで自動採番させる。この設定にするためには、Id列のData typeをserial、Primary key?のスイッチをオンにするとよさそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5138df85-5a79-d4a0-8fec-a70fe0957c9d.png)

# Service CenterでDatabase Connectionを定義する
ここからはOutSystemsでの作業になる。

Database Connectionは、外部DBへの接続文字列の定義を行うもの。
各環境（開発、QA、本番など）に作成し、外部DBのExtensionは、どのDatabase Connectionを使うかを設定する。

1. Service Centerにアクセスする
1. トップのメニューからAdministration > Database Connectionを選択
1. New Database Connectionのリンクをクリック
1. DBMS項目でPostgreSQL / Aurora PostgreSQL、Configuration Mode項目でAdvanced configurationを選択し、各項目を以下の通り入力する（Database Credentialsセクションと書いてある部分は、Heroku PostgresのDatabaseページ > Settingsタブ > Database Credentialsセクションからコピー）
    - Name：任意の名前。後でExtensionに紐づけるときに確認する名前なので、わかりやすいものに
    - Username：Database CredentialsセクションのUser
    - Password：Database CredentialsセクションのPassword
    - Configuration Parameters（\<\>で囲んだ部分はDatabase Credentialsセクションの同名項目の値で置き換え）：database=\<Database\>;host=\<Host\>;port=\<Port\>;SSL Mode=Require;Trust Server Certificate=true
1. Test Connectionして問題なければCreate。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/49a337db-8278-2082-1764-dfae2306e34c.png)

# テスト用Tableを取り込むExtensionを作成する
1. Service Studioでテスト用のアプリケーションを開き、モジュールの種別をExtensionにして新しいモジュールを追加する
1. 追加したExtensionを開く
1. Integration Studioが開くのでログイン
1. Entitiesフォルダを右クリック→Connect to External Table or View...を選択
1. Available Database Connectionsでは↑で作成したDatabase Connectionを選択
1. Available Databasesでは、Tableを作成したSchema（↑ではpublic）を選択
1. Select the Tables and Viewsでは、テストに使うTableを左のリストで選択し、Addボタンをクリックして右のリストに移してからNext
1. Publish（Integration Studioの1-Click Publishアイコンは小さいが、Service Studioと同じ形と色でメニューの位置にある）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5d4a43fb-3428-7ea5-6d2e-88074d9deefe.png)


# Extensionを経由して検索／更新する画面を作成してテスト
ここまできたら、普通のEntityと同じように検索／更新を行える。
参照追加し、UI FlowにEntityをドラッグ＆ドロップして動作確認すると以下のように表示できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/60f1f3a1-97ac-cc20-a78d-18d34245b565.png)