NODE-REdの初学者ですが、ローカル環境のWindows10proで、Node-RED + SQLite3 + MySQL + PostgreSQL で基本的なCRUD操作を行うREST APIを作成を試みました
試みて、最初のつまずき、function ノードに INSERT文 UPDATE文 書き方がわかりにくかった。
SQLite3 と MySQL (MariaDBも) では、CRUDがとりあえず、動作したようなので( 正解なのかは、不明ですが )投稿させていただきます。(間違いあれば、ご指摘ください)
PostgreSQL は、インサートとアップデートの方法が、まだ不明です、 Microsoft SQL Server と Firebied用のノードも存在するようなので、ついでに、試してみましたが、今回は、動作に至りませんでしたた( ご存じの方/知見のある方は、補完いただけると幸いです )
テスト環境 サーバー側として
PC : Windows10
Node.js 20.10.0LTS
npm 10.2.3
NODE-Red v3.1.0
node-red-node-sqlite 1.1.0
node-red-node-mysql1.0.3
node-red-contrib-postgresql0.14.0
node-red-contrib-postgres-multi0.2.0
データベースの共通構造として
データベース名 : test3
テーブル名 : users
テーブル構造 : CREATE TABLE users ( id int, name TEXT);
SQLite3は、DB Browser for SQLiteインストール
データベースを D:\test3.db としました。
usersと名前でテーブルを作成
CREATE TABLE users ( id int, name TEXT);
MySQLは、8.0.35.0をインストール
データベースを test3としました。
user を myusr1
パスワード を Passwd123
CREATE TABLE users ( id int, name TEXT(50));
MaridB 11.2.2 をインストール(接続ノードはMySQLで動作確認しました) 権限設定のコマンドは
CREATE Database test3;
use test3;
CREATE TABLE users ( id int, name TEXT);
grant all privileges on . to myusr1 identified by 'Passwd123';
FLUSH PRIVILEGES;
PostgreSQLは、16.1.1をインストール
データベースを test3としました。
user を postgres
パスワード を Passwd123
CREATE TABLE users ( id int, name TEXT);
Firebird4.0をインストール
データベースを d:\test3.fdbとしました。
user を sysdba
パスワード を Passwd123
CREATE TABLE users ( id int, name TEXT);
MS-SQLSERVER 2022Expressをインストール
データベースを test3としました。
user を sa
パスワード を Passwd123
としましたが、認証モードの変更が、うまくできなかったまで、Windows認証ののま動作
CREATE TABLE users ( id int, name nTEXT);
RESTAPIクライアント側として
POSTMAN や Insomnia ではなく、 embarcadero Delphi製 の REST Debugger で試してみました。
NODE-Redで SQLite を使用での 作成ルール (メソッドに _sq をつける)
HTTP メソッド | URL | SQL文の例 |
---|---|---|
GET | get_sq | SELECT * FROM users order by id; |
GET | get_sq/:param_no | SELECT * FROM users WHERE id = :param_no; |
POST | post_sq | INSERT INTO users (id,name) values (:id ,' :name); |
PUT | put_sq/:param_no | UPDATE users SET id=:id, name = :name WHERE id= :id; |
DETETE | del_sq/:param_no | DELETE FROM users WHERE id = :param_no; |
function ノードの記述
get_sq
msg.topic = "SELECT * FROM users order by id;"
console.log(msg.topic);
return msg;
get_sq/:param_no
nn = msg.req.params.param_no;
msg.topic = "SELECT * FROM users" + " WHERE id=" + nn + ";";
console.log(msg.topic);
return msg;
post_sq
nn = msg.payload.id; //int
mm = msg.payload.name; //text
msg.topic = "INSERT INTO users " + " (id,name) values (" + nn + ",'" + mm + "');";
console.log(msg.topic);
return msg;
put_sq/:param_no
nn = msg.req.params.param_no;
mm = msg.payload.name;
msg.topic = "UPDATE users SET " + " id=" + nn + ", name = '" + mm + "' WHERE id=" + nn + ";";
console.log(msg.topic);
return msg;
del_sq/:param_no
nn = msg.req.params.param_no;
msg.topic = "DELETE FROM users" + " WHERE id=" + nn + ";";
console.log(msg.topic);
return msg;
node-redをデプロイ
node-red-node-sqliteの設定は、こんな感じです
REST DebuggerのContent-Type を application/jsonとします
Headers / Body / Tabular Data のタブを切り替えて、参照できます
post / put のJSON は、Custom body:に記述します
SQLite用の実行例
get
http://192.168.24.103:1880/get_sq
get
http://192.168.24.103:1880/get_sq/3
put
http://192.168.24.103:1880/put_sq/3
post
http://192.168.24.103:1880/post_sq
delete
http://192.168.24.103:1880/del_sq/5
データの新規追加登録(post)用のJSON
{
"id":1,
"name":"AA"
}
{
"id":2,
"name":"BB"
}
{
"id":3,
"name":"CC"
}
データの更新録(put)用のJSON
{
"name":"DD"
}
NODE-Redで MySQL を使用での 作成ルール (メソッドに _my をつける)
HTTP メソッド | URL | SQL |
---|---|---|
GET | get_my | SELECT * FROM users order by id; |
GET | get_my/:param_no | SELECT * FROM users WHERE id = :param_no; |
POST | post_my | INSERT INTO users (id,name) values (:id ,' :name); |
PUT | put_my/:param_no | UPDATE users SET id=:id, name = :name WHERE id= :id; |
DETETE | del_my/:param_no | DELETE FROM users WHERE id = :param_no; |
function ノードの記述内容はSQLitesと同じ
データの新規追加登録(post)用/更新録(put)用のJSONも同じ
MySQLのノードを追加してnode-redをデプロイ
node-red-node-mysql の設定は、こんな感じです
MySQL用の実行例
get
http://192.168.24.103:1880/get_my
get
http://192.168.24.103:1880/get_my/3
put
http://192.168.24.103:1880/put_my/3
post
http://192.168.24.103:1880/post_my
delete
http://192.168.24.103:1880/del_my/5
PostgreSQL用の課題
function ノードは何を使用するのがよいか node-red-contrib-postgresql / node-red-contrib-postgres-multi ?
上記例と同様の動作をしたい場合、function ノードに記述するのか?、PostgreSQLのノードに記述するのか?
などが、わからす、ChatGTP3.5にも、『 Node-Redで、PostgreSQLのrest-apiのサンプルJSON 』 などと聞いてみましたが、私は解決できませんでした
node-red-contrib-postgresql の設定は、こんな感じで、上2つと異なるところは、query を記述する箇所が存在しています
SELECT * FROM users order by id; を node-red-contrib-postgresql に直接記述して、functionノードなしで、動作しました
SELECT * FROM users WHERE id = :param_no; は
functionノードに
msg.params = [ msg.req.params.param_no ];
return msg;
node-red-contrib-postgresql に
SELECT * FROM users WHERE id =$1;
DELETE FROM users WHERE id =$1; は 動作しました
INSET と UPDATE の 動的パラメータの引き渡し方が、まだ理解できていないので、動作さられなかったようで、サンプルを探したが見つけられませんでした、( ChatGTP3.5にも聞いては見たのですが....)
node-red-contrib-mssql-plus の設定は、こんな感じですか、設定間違いで、接続できていないようです
node-red-contrib-mssql-plus の設定は、こんな感じですか、設定間違いで、接続できていないようです
node-red-contrib-postgres-multi の設定は、こんな感じで、上2つと同様な感じです
node-red-contrib-node-firebird も存在するようで、動作させらませんでしたが、こんな感じです
MS-SQLSERVERは たぶん node-red-contrib-mssql でも動作するような気がしますが、今回は、試せていません
ノーコードが大流行の昨今ですが、ノーコードで解決できにくい隙間を埋めるローコードのツールとして、NODE-Redの情報量(サンプルフロー)がふえると、ありがたいと感じています。
個人的にですが、
NODE-RedとRESTAPIの初学者としては、初歩的/基礎的なデータベース用のノードのサンプルが、増えることを願います。
こういった、疑問や質問は、スラックに投稿しても、良いものでしょうか?
あとオフラインの集まりがあれば、参加してみたいです。