久しぶりにHeroku Postgresを使ったフローを作っていて気がついたのですが、オープンソースで公開されていたre-postgresノードだとうまくいかないことに気がつきました😅
https://flows.nodered.org/node/node-red-contrib-re-postgres
Node-REDのPostgresノードのなかでは、このre-postgresノードを重宝していたのですが、Heroku Postgres側の仕様が変わったようです。
公開されている別のPostgres用のノードを発見しましたので、その使い方をご紹介したいと思います。
Herokuで使えるPostgresノード
以下のPostgresqlノードが今回使用したノードです。
https://flows.nodered.org/node/node-red-contrib-postgresql
インストールはパレットの管理から行います。
ノードのプロパティ
ここでは、どのような設定をすれば接続できるかをご説明します。Heroku Postgresを使ったことがない方向けのHerokuの設定手順は少し長くなりますので、記事の最後に記載します。
Postgresqlノードをクリックしてプロパティ画面を開きます。Serverの右端にある鉛筆マークのアイコンをクリックしてデータベースサーバーへの接続情報を入力します。
次にデータベースサーバーへの接続情報はHeroku Postgresの管理コンソールから転記して入力します。
ここでConnectionタブに戻って、SSLの左端のプルダウンをクリックして、JSONを選択します。
Heroku PostgresでSSLは必須となるため、JSONには以下の設定値を記載します。
{ "require": true, "rejectUnauthorized": false }
全て入力したら、更新ボタンをクリックして設定値を保存します。これでノードは使えるようになりましたので、あとはノードにSQLを渡すだけです。
サンプルフロー
PostgresqlノードにSQLを渡すには、msg.queryを使用します。templateノードを使って、SQLを記載して、msg.queryに設定します。
サンプルフローをDiscoverに公開しておりますので、ご自分のプロジェクトにインポートしてご覧ください。
以下は、devicestatusというテーブルを作成し、INSERT文、SELECT文を設定した例になります。
CREATE TABLEやSELECTは一般的なSQLの構文ですが、INSERT文は少し変わっています。INSERT文のSQLを少し解説しますと、以下のような構文になっています。
INSERT INTO devicestatus (devicename,devicestatus,timestamp) VALUES (
'{{devicename}}',
'{{devicestatus}}',
'{{timestamp}}'
);
{{devicename}}のような見慣れない書き方になっていますが、これはMustache記法と呼ばれているものです。二重カッコ{{でフローの変数をくくることで、動的にSQL文を作ることができます。Mustache記法の簡単な使い方はこちらの記事をご覧ください。
参考:Heroku Postgresの準備
ここでは、Heroku Postgresを使ったことがない方向けに設定を順に示したいと思います。
Herokuアプリ作成とアドオンの追加
Herokuのアプリを作ったら、ResourcesタブのAdd-onsを追加する画面がありますので、Heroku Postgresを追加して、プランを選択します。
追加されたら、Heroku Postgresのリンクをクリックして、Heroku Postgresの管理画面を開きます。
Heroku Postgresの接続情報
SettingsタブのDatabase Credentialsに接続情報が記載されています。
SQLの操作
今回の記事では、Node-REDでSQLの操作をしました。参考までですが、DataClipsを使えば、Heroku上で直接SQLを書いて実行することができます。
保存もできます。