第25章 SQL データベースへの接続

インテグレーションでは、以下の SQL データベースに接続することができます。

  • Apache Derby
  • MySQL
  • PostgreSQL

インテグレーションでアクセスするデータベースへのコネクションを作成します。その後、インテグレーションを作成し、データベースコネクションをインテグレーションに追加します。

他の種類のデータベースに接続するには、そのデータベースの JDBC ドライバーをアップロードする必要があります。

以下を参照してください。

25.1. データベースコネクションの作成

インテグレーションで接続する各データベースの個別のコネクションを作成します。複数のインテグレーションで同じコネクションを使用できます。

データベースコネクションは指定のデータベーステーブルで操作するか、指定のストアドプロシージャーを呼び出します。

前提条件

インテグレーションがデータベースに接続するときにデータベーステーブルまたはストアドプロシージャーが存在する必要があります。

手順

  1. 接続するデータベースの JDBC ドライバーがクラスパスにあるようにしてください。プロプライエタリーデータベースに接続するために JDBC ドライバーライブラリーエクステンションをアップロードした場合、ドライバーはアップロードプロセスによってクラスパス上に置かれます。「JDBC ドライバーライブラリーエクステンションの作成」を参照してください。
  2. Fuse Online の左パネルで Connections をクリックし、利用可能なコネクションを表示します。
  3. Create Connection をクリックし、Fuse Online コネクターを表示します。
  4. Database コネクターをクリックします。
  5. 以下を入力してコネクションを設定します。

    1. Connection URL フィールドに、接続するデータベースの JDBC URL を入力します。たとえば、jdbc:postgresql://ignite-db1234/sampledb を入力します。
    2. Username フィールドに、データベースのアクセスに使用するアカウントの名前を入力します。同じアカウントのパスワードとユーザー名を指定するようにしてください。
    3. Password フィールドに、データベースのアクセスに使用する、ユーザーアカウントに関連するパスワードを入力します。
    4. Schema フィールドにデータベースのスキーマの名前を入力します。データベーススキーマの指定方法は、データベースのタイプによって異なります。詳細は、次のセクションの「データベースコネクションでスキーマを指定する方法」を参照してください。
  6. Validate をクリックします。Fuse Online はコネクションの検証を試み、検証の成功または失敗を示すメッセージを表示します。検証に失敗した場合は、必要に応じて設定の詳細を修正し、再度検証を行います。
  7. 検証に成功した場合は Next をクリックします。
  8. Name フィールドに、このコネクションを別のコネクションと区別するために使用する名前を入力します。たとえば、PostgreSQL DB 1 を入力します。
  9. Description は任意のフィールドで、このコネクションに関する便利な情報を入力します。たとえば、Sample PostgreSQL connection that uses my login credentials. を入力します。
  10. Save をクリックし、作成したコネクションが利用可能になったことを確認します。上記の例の名前を入力した場合は、インテグレーションに追加できるコネクションとして PostgreSQL DB 1 が表示されます。

25.2. データベースコネクションでスキーマを指定する方法

Fuse Online では、データベースコネクションの作成時に、ユーザーインターフェースでデータベースのスキーマを指定するよう要求されます。スキーマの指定方法はデータベースごとに異なります。以下の表は、各データベースに必要なものを表しています。

データベースコネクション設定の例注記

Apache Derby

接続 URL (JDBC URL): jdbc:derby:memory:testdb;create=true
ユーザー名: sa
パスワード: 任意の値
スキーマ: sample

テストの目的でのみ使用してください。デフォルトのユーザー名は sa で、パスワードは任意の値ですが、値を入力する必要があります。この設定例では、コネクションで namespace のような sample スキーマを使用します。たとえば、sample.mytablemytable テーブルを参照できます。

MS SQLServer

接続 URL (JDBC URL): jdbc:sqlserver://localhost:1433/sampledb
ユーザー名: kurt
パスワード: mypw
スキーマ: sampledb

エクステンションの仕組み を利用してドライバーをアップロードします。コネクションを作成します。ドライバーをアップロードしていない場合は、コネクションの検証に失敗します。コネクション URL の最後と、Schema フィールドに同じスキーマを指定する必要があります。

MySQL

接続 URL (JDBC URL): sql-connector.url=jdbc:mysql://mysql-host:3307/test?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
ユーザー名: kurt
パスワード: mypw
スキーマ:

MySQL はスキーマをサポートしません。MySQL データベースへのコネクションを作成する場合は Schema フィールドを空白のままにしておきます。MySQL は、接続 (JDBC) URL のすべて設定を想定します。

Oracle DB

接続 URL (JDBC URL): jdbc:oracle:thin:@10.192.212.255:1521:xe
ユーザー名: kurt
パスワード: mypw
スキーマ:

Fuse Online の エクステンションの仕組み を使用して Oracle データベースドライバーをアップロードします。コネクションを作成します。ドライバーがアップロードされていない場合は、コネクションの検証に失敗します。
スキーマはデータベース名です。Oracle の用語ではスキーマと呼ばれるこのデータベースインスタンスにアクセスするパーミッションが必要です。Schema フィールドを空白のままにしておきます。Connection フィールドで、このデータベースインスタンスの Oracle システム識別子 (SID) を参照する必要があります (この例では xe)。

PostgreSQL

接続 URL (JDBC URL): jdbc:postgresql://syndesis-db:5432/sampledb
ユーザー名: kurt
パスワード: mypw
スキーマ: sampledb

接続 (JDBC) URL でデータベースを指定する必要があります。スキーマを使用する場合は、Schema フィールドにスキーマを指定する必要があります。クエリーは、database.schema.table 形式のテーブルを参照できます。参照がテーブル名のみを指定する場合、コネクションの設定時に指定したスキーマを最初に検索します。テーブルが見つからない場合、コネクションは指定のテーブルのパブリックリソースを検索します。詳細は、PostgreSQL のスキーマドキュメント を参照してください。

Teiid

接続 URL (JDBC URL): jdbc:teiid:<vdb-name>@mm://localhost:31000
ユーザー名: 任意の値
パスワード: 任意の値
スキーマ:

データ仮想化 機能などを使用して、仮想データベースがすでに作成済みである必要があります。接続 URL の <vdb-name> を仮想データベースの名前に置き換えます。Teiid への接続に対するセキュリティーはまだ実装されていません。Username および Password フィールドに任意の値を指定します。Schema フィールドを空白のままにしておきます。このドライバーは Fuse Online ですでに利用可能です。

重要

データ仮想化はテクノロジープレビュー機能です。テクノロジープレビューの機能は、Red Hat の実稼働環境のサービスレベルアグリーメント (SLA) ではサポートされず、機能的に完全ではないことがあります。Red Hat では、これらについて実稼働環境での使用を推奨していません。テクノロジープレビューの機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストやフィードバックの提供を可能にするために提供されます。Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、「テクノロジプレビュー機能のサポート範囲」 を参照してください

25.3. データベースレコードを取得してインテグレーションの実行をトリガー

SQL ステートメントまたは SQL ストアドプロシージャーの呼び出し結果を基にしてインテグレーションの実行をトリガーするには、データベースコネクションをインテグレーションの最初のコネクションとして選択します。

前提条件

データベースコネクションが作成されている必要があります。

手順

  1. Fuse Online パネルの左側にある Integrations をクリックします。
  2. Create Integration をクリックします。
  3. Choose a connection ページで、インテグレーションを開始するために使用するデータベースコネクションをクリックします。
  4. Choose an action ページで、以下の 1 つを選択します。

    • Periodic SQL invocation は、指定した SQL ステートメントを定期的に呼び出して、データを取得します。
    • Periodic stored procedure invocation は、選択または指定したストアドプロシージャーを定期的に呼び出して、データを取得します。
  5. Periodic SQL invocation を選択した場合、Query フィールドに SQL SELECT ステートメントまたは 1 つ以上のレコードを取得する他の標準の SQL ステートメントを入力します。例: SELECT * from my_db_table必要なデータが含まれるデータベーステーブルが存在する必要があります。

    Periodic stored procedure invocation を選択した場合、Procedure name フィールドに必要なデータを取得するために呼び出すストアドプロシージャーを選択または入力します。指定するストアドプロシージャーが存在する必要があります。データベース管理者は、インテグレーションで使用する必要があるストアドプロシージャーを作成しておく必要があります。

  6. Period フィールドに整数を入力し、単位がミリ秒、秒、分、時間、または日であるかを示します。たとえば、5 minutes を指定した場合、コネクションは指定のステートメントまたはストアドプロシージャーを 5 分間隔で呼び出します。
  7. Next をクリックします。

SQL エクステンションを使用する時の制限事項

Query フィールドに入力する SQL ステートメントは、標準の SQL コンストラクトでなければなりません。Fuse Online は、Procedural Language/PostgreSQL (PL/pgSQL) または Oracle Procedural Language Extensions to SQL (PL/SQL) などの SQL エクステンションを認識または解析しません。ただし、ストアドプロシージャーでは SQL エクステンションを使用できます。

結果

Fuse Online はコネクションの検証を試みます。これには、指定の SQL ステートメントの構文チェックや、ステートメントまたはストアドプロシージャーターゲットデータの存在確認が含まれます。検証に成功した場合、Fuse Online は最初のコネクションをインテグレーションに追加します。検証に失敗した場合、問題に関するメッセージが Fuse Online に表示されます。必要に応じて入力を更新し、再試行します。

25.4. データを更新する SQL ステートメントのパラメータープレースホルダーおよび値

フローの途中にあるデータベースコネクションや、シンプルなインテグレーションを終了するデータベースコネクションは、データを更新する SQL ステートメントを実行できます。データベースコネクションをインテグレーションに追加するとき、実行する SQL ステートメントのプレースホルダーパラメーターを指定できます。実行中、入力パラメーターの値がコレクションにあるとコネクションはバッチ更新を実行できます。

SQL ステートメントでのパラメーターの指定

インテグレーションを作成または編集し、データベースを更新するコネクションを追加する場合、ランタイムにコネクションが実行する SQL ステートメントにプレースホルダーパラメーターを指定したり、ランタイムに実行されるストアドプロシージャーにプレースホルダーを含めることができます。以下に例を示します。

INSERT INTO TODO(task, completed) VALUES(:#param_1, :#param_2)
DELETE FROM TODO WHERE task LIKE :#param_3

これらのプレースホルダーの値を指定するには、フローのデータベースコネクションの前にデータマッピングステップを追加します。データマッピングステップで、適切なソースデータフィールドをターゲットデータフィールドにマップします。たとえば、ソースデータを :#param_1:#param_2、および :#param_3 ターゲットフィールドにマップします。「データマッパーステップの追加」を参照してください。

パラメーター値のコレクションでのバッチ更新

ランタイムにデータベースコネクションがデータを挿入、削除、または更新する SQL ステートメントを実行すると、実行された SQL ステートメントは多くの場合で 1 つ以上のプレースホルダーパラメーター (例: :#task) を指定します。この場合、パラメーターの単一セットまたはパラメーターセットのコレクションをコネクションの入力とすることができ、セットの各要素が対応するプレースホルダーパラメーターの値を定義します。

たとえば HTTP リクエスト (Webhook)や API プロバイダーインテグレーションの REST API サービスに送信されたリクエストなど、データベースコネクションへの入力はフローの前のコネクションから取得されます。入力がコレクションである場合、コネクションはバッチモードを使用してテーブルを更新します。たとえば、以下の SQL ステートメントについて考えてみましょう。

insert into todo (task) values (:#task)

入力コレクションに 3 つの値が含まれる場合、コネクションは値ごとに 1 つずつ、3 つのレコード挿入します。ここで、2 つのプレースホルダーパラメーターを持つ SQL ステートメントについて考えてみましょう。

insert into todo (task, completed) values (:#task, :#completed)

この SQL ステートメントを実行するコネクションへの入力で、データシェイプ仕様は単一の要素を指定できます。例を以下に示します。

{"task": "write some docs", "completed": 0}

代わりにコレクションを指定することもできます。例を以下に示します。

[{"task": "write doc", "completed": 1},
 {"task": "publish doc", "completed": 0}]

コレクションを入力とする場合、コネクションはパラメーター値に各セットに対して 1 度挿入操作を実行します。この例では、コネクションはパラメーター値の各セットに 1 つずつ、2 つのレコードをテーブルに追加します。

25.5. インテグレーションの途中またはインテグレーションを完了するためにデータベースにアクセス

インテグレーションでは、フローの途中でデータベースにアクセスしたり、シンプルなインテグレーションを終了するためにデータベースにアクセスすることができます。これには、データベースコネクションをフローの途中に追加するか、シンプルなインテグレーションの最後のコネクションとして追加します。

前提条件

  • データベースコネクションが作成されている必要があります。
  • フローを作成または編集することになり、Fuse Online でインテグレーションに追加するよう要求されます。または、Fuse Online で最後のコネクションを選択するよう要求されます。

手順

  1. Add to Integration ページで、コネクションの追加先のプラス記号をクリックします。Fuse Online が最後のコネクションを選択するよう要求する場合は、このステップをスキップします。
  2. アクセスするデータベースのデータベースコネクションをクリックします。
  3. Choose an action ページで、以下の 1 つを選択します。

    • Invoke SQL は、指定の SQL ステートメントを実行してデータを操作します。
    • Invoke stored procedure は指定または選択したストアドプロシージャーを呼び出してデータを操作します。
  4. Invoke SQL を選択した場合、SQL Statement フィールドで以下を行います。

    • 途中のコネクションでは、1 つ以上のレコードを取得する SQL SELECT ステートメントを入力するか、1 つ以上のレコードを操作する SQL INSERTUPDATE、または DELETE ステートメントを入力します。データが含まれるデータベースが存在する必要があります。
    • 最後のコネクションでは、SQL INSERTUPDATE、または DELETE ステートメントを入力し、1 つ以上のレコードを操作します。
    • Batch update フィールドで、デフォルトの No を使用するか、Yes を選択します。

      Batch update の設定は、このアクションへの入力がコレクションで、SQL ステートメントがレコードを挿入、削除、または更新する場合にコネクションの動作に影響します。デフォルトの動作 (Batch updateNo の場合) では、コネクションは個別のオブジェクトのみを受け入れ、各オブジェクトに対して 1 度 SQL ステートメントを実行します。Batch updateYes の場合、コネクションはコレクションをアクションへの入力として受け入れます。コネクションは SQL ステートメントを 1 度実行し、すべてのコレクションアイテムをバッチ更新操作への入力として使用します。

    Invoke stored procedure を選択した場合、Procedure name フィールドに必要なデータを操作するために呼び出すストアドプロシージャーの名前を選択または入力します。指定するストアドプロシージャーが存在する必要があります。データベース管理者は、インテグレーションで使用する必要があるストアドプロシージャーを作成しておく必要があります。

  5. Next をクリックします。

結果

Fuse Online はコネクションの検証を試みます。これには、指定の SQL クエリーの構文チェックや、クエリーまたはストアドプロシージャーターゲットデータの存在確認が含まれます。検証に成功した場合、Fuse Online でコネクションがフローに追加されます。検証に失敗した場合、問題に関するメッセージが Fuse Online に表示されます。必要に応じて入力を更新し、再試行します。

25.6. プロプライエタリーデータベースへの接続

プロプライエタリー SQL データベースに接続する場合、以下の主なタスクを行う必要があります。

  1. 開発者は、インテグレーションで接続するデータベースの JDBC ドライバーが含まれるライブラリーエクステンションを作成します。「JDBC ドライバーライブラリーエクステンションの作成」を参照してください。
  2. 開発者はライブラリーエクステンションが含まれる .jar ファイルを提供します。
  3. その .jar ファイルを Fuse Online にアップロードします。「カスタム機能の使用」を参照してください。
  4. Fuse Online の Database コネクターを選択し、データベースのコネクション URL を指定して、データベースへのコネクションを作成します。「データベースコネクションの作成」を参照してください。
  5. インテグレーションで、コネクションをデータベースに追加します。「データベースレコードを取得してインテグレーションの実行をトリガー」または「インテグレーションの途中またはインテグレーションを完了するためにデータベースにアクセス」を参照してください。