ローカル環境で、SQLite3 と MySQL と PostgreSQL で基本的なCRUD操作を行うREST APIを作成を試みました

![Something went wrong]()
## 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;
![ma01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/920e9979-0169-8753-7f30-1d35b3bafd9e.png)




>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);

----

[Qiita](http://qiita.com/)

#### RESTAPIクライアント側として
#### POSTMAN　や　Insomnia　ではなく、 [embarcadero Delphi製 の REST Debugger](https://www.embarcadero.com/jp/free-tools/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の設定は、こんな感じです
![21_node_sqlite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/b9068370-12f3-b8aa-ddaf-d5926cf17c50.png)


![node-red_01_SQLite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/57dea802-fd84-37c7-4fa9-377c165aa3a6.png)

***

REST DebuggerのContent-Type を　application/jsonとします
Headers / Body / Tabular Data のタブを切り替えて、参照できます
post / put のJSON　は、Custom body:に記述します

![ma07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/ce7950fb-9eb8-4688-8494-f6e0006c10c6.png)

MariaDB上のデータ
![ma05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/a1768a28-7169-6f45-4e54-b449d833a6e4.png)


>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 をつける)
MySQL-nodeの設定は、こんな感じです
![22_node_mysql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/90b60fda-f010-d5f7-d645-167d87fa242d.png)




|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　の設定は、こんな感じです
![22_node_mysql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/121ff596-6730-7dbe-dd07-eb1eb9f64b25.png)


![node-red_02_MySQL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/c0720c9b-7a54-a933-bbd4-372696392354.png)

>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_03_PostgreSQL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/eb94e47f-ea89-6c08-2dc3-b29f488c757c.png)

>node-red-contrib-postgresql の設定は、こんな感じで、上2つと異なるところは、query　を記述する箇所が存在しています
SELECT * FROM users order by id; を　node-red-contrib-postgresql に直接記述して、functionノードなしで、動作しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/e7314ba0-8e6e-0d9b-5a6a-7837560c0bdd.png)



>SELECT * FROM users WHERE id = :param_no;  は
functionノードに
msg.params = [ msg.req.params.param_no ];
return msg;
![26_node_pg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/6a3cdefe-fa53-aa0f-5e09-4c8c2d1df3b0.png)

>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　の設定は、こんな感じですか、設定間違いで、接続できていないようです
![29_node_ms.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/074e8c59-0cf5-f6c3-c7a8-dcd7408bb03d.png)
![30_node_ms.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/4359ce3a-8535-c61a-f06a-558962c23a99.png)

node-red-contrib-mssql-plus　の設定は、こんな感じですか、設定間違いで、接続できていないようです
----

node-red-contrib-postgres-multi の設定は、こんな感じで、上2つと同様な感じです
![24_node_pg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/dcc0a965-7e24-1ccf-f863-8836cb5a1e7b.png)

----
node-red-contrib-node-firebird　も存在するようで、動作させらませんでしたが、こんな感じです
![27_node_fb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/0981323b-fd6f-aee7-7a20-1033bed5467c.png)
![28_node_fb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/c6dbb8d1-b081-b2be-26ed-1e4e86bb02a2.png)

----
MS-SQLSERVERは　たぶん　node-red-contrib-mssql　でも動作するような気がしますが、今回は、試せていません
![32_ms.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/f7795661-762d-5a29-7442-052bc5966e0e.png)
![33_ms.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59472/5bbca07b-43e3-12c1-e937-0dd84c9f79fe.png)
-----

ノーコードが大流行の昨今ですが、ノーコードで解決できにくい隙間を埋めるローコードのツールとして、NODE-Redの情報量(サンプルフロー)がふえると、ありがたいと感じています。

>個人的にですが、
NODE-RedとRESTAPIの初学者としては、初歩的/基礎的なデータベース用のノードのサンプルが、増えることを願います。
こういった、疑問や質問は、スラックに投稿しても、良いものでしょうか?
あとオフラインの集まりがあれば、参加してみたいです。