NocobaseからデータベースのViewに接続する

NocobaseからデータベースのViewに接続する

Clock Icon2024.11.11

Nocobaseで運用しているアプリで所属や役割などの履歴を持ちつつ現在の状態を表示させることはできない?_その2
 
でSQLコレクションを使ってデータ表示を行いました。
データベースにViewを作るのではなく、Nocobase上で全ての操作ができるので簡潔にやりたいことを可能にしてくれました。

NocobaseではデータベースのViewに接続する方法も提供されています。
今回はこの方法でも試してみようと思います。

データベースでViewを作成

Nocobaseのアプリから接続するためのViewを作成します。

使用しているデータソース接続がMySQLなので、MySQLでViewを作成してみます。

CREATE VIEW ステートメント

Nocobaseアプリで接続している実テーブルから作っておきます。

例)

CREATE VIEW emp_departments AS
SELECT emp.employee_id, emp.name, dep.department, emp.hire_date,r.id as rel_id
FROM employees emp
LEFT JOIN r_employees_and_departments r as r.employee_id = emp.id
LEFT JOIN departments dep as dep.id = r.department_id

Viewへの接続作成

スクリーンショット 2024-11-11 14.19.37
コレクションの管理画面からコレクションの作成時にVIewに接続を選択します。

スクリーンショット 2024-11-11 14.29.10

このようにデータベースに作成したViewが選択肢として現れます。

スクリーンショット 2024-11-11 14.31.47

フィールドの箇所にViewで定義した内容が表示されます。

スクリーンショット 2024-11-11 14.32.39

Nocobaseでのフィールドタイプを設定するとプレビューが見れるようになります。
データソースのフィールタイプに合わせて設定しておきます。

スクリーンショット 2024-11-11 14.35.09

ユニークキーを指定したいのですが、新規作成では候補のカラムが現れませんでした。不具合かもしれません。

スクリーンショット 2024-11-11 14.36.11

一度保存して、フィールドの設定画面からユニークキーを設定しました。

スクリーンショット 2024-11-11 14.58.29

ブロックで表示させるときのためのフィールド表示名の設定も行えます。

ブロック追加

ページのブロック追加から作成したViewを表示できるかみてみます。

スクリーンショット 2024-11-11 14.52.00

このように先ほど作成したViewコレクションを選択できるようになっているはずです。

スクリーンショット 2024-11-11 15.17.44

他のコレクションと同じようにViewの内容が表示されますね。

スクリーンショット 2024-11-11 15.18.45
SQLコレクションと同じように、VIewコレクションでもデフォルトでは表示のみ可能です。

ただし、Viewコレクションではデータベースの仕様に沿った形でデータ編集ができます。

データ編集ができるView

スクリーンショット 2024-11-11 15.22.58

コレクションの編集画面や作成画面で削除変更操作の許可にチェックを入れると
スクリーンショット 2024-11-11 15.24.32
このように編集や削除の操作メニューが現れるようになります。

ただしViewがデータ編集に対応していない形式だと

スクリーンショット 2024-11-11 15.46.35

このように保存ボタンを押してもエラーとなりました。

MySQLで更新可能なViewの条件は、

更新可能および挿入可能なビュー に書かれている通りです。

  • 単一テーブルからのみ選択されている
  • 定数ではない列
  • 集約関数を使用していない
  • DISTINCT句がない
  • サブクエリを含まない

といったものが挙げられていますね。

今回試したサンプルではJoinを使用していたので編集はできません。

create view sample_view_2 as select id, name, updatedAt from m_employees;

このようなViewだと編集は可能でした。

MySQLではビューに対してWITH CHECK OPTIONを追加すると、ビューの定義に適合しないデータの挿入や更新ができなくなります。

たとえば、営業部以外の従業員を追加できないようにするには次のようにします。

CREATE VIEW sales_employees AS
SELECT employee_id, name, department, salary, hire_date
FROM employees
WHERE department = '営業部'
WITH CHECK OPTION;

WHERE句がtrueでない行への挿入を防止できます。 また、WHERE句がtrueであるが、更新によってtrueにならない行の更新も防止されます

このようにデータベースによる強力な機能が必要な場合はSQLコレクションよりViewを接続して使ったほうが便利になる可能性がありますね。

PostgreSQLやOracle、SQL Serverでも単一テーブル、集約関数の不使用、サブクエリやJOINなしといった条件が共通しており、これらを満たすシンプルなビューは更新可能です。

INSTEAD OF トリガーがサポートされるデータベースでは、これを使用することにより複雑なVIewでも更新可能になるようです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.