SQLによる読み取り

SQL文によるデータ取得とSQL文の保存

概要

データベースから読み取るには、SQL文を記述します。例えば、次のクエリーはすべてのユーザーを取得します。

select * from users;

このクエリーをusersという名前にして保存します。ページ内の他の場所でクエリーにアクセスできるようになります。

2630

SQL文を記述し、usersとして保存します

保存したら、query.dataによってクエリーの結果にアクセスします。SQLクエリーは、列ベースの形式でデータを返します。

{
  "column1": [1, 2, 3],
  "column2": [1, 2, 3],
  ...
}

🚧

SQLクエリーからのデータはオブジェクトの配列として返されません

データをオブジェクトの配列として使用する必要がある場合は、ヘルパー関数formatDataAsArrayを使用できます。

{{ formatDataAsArray(sqlQuery.data) }}

チェックボックスに基づいて、アクティブまたは非アクティブなユーザーを選択します。

select * from users where active = {{checkbox1.value}}

テキスト入力と完全に一致する名のユーザーを選択します。

「Mary」と入力した場合は、名が「Mary」であるユーザーのみと一致します。

select * from users where first_name ILIKE {{textinput1.value}}

テキスト入力と部分的に一致する名のユーザーを選択します。

「Ma」と入力した場合は、「Mary」および「Margaret」と一致します。

select * from users where first_name ILIKE {{'%' + textinput1.value + '%'}}

チェックボックスが定義されている場合は条件と照合します。そうでない場合はすべてと一致します。

select * from users where (
	{{!checkbox1.value}} OR active = {{checkbox1.value}}
);

checkbox1.valueがfalseの場合、これはselect * from users where (TRUE OR active = false)に評価され、すべてのユーザーが返されます。checkbox1.valueがtrueの場合、これはselect * from users where (FALSE OR active = true)に評価され、アクティブなすべてのユーザーが返されます。

配列内の要素と一致する名のユーザーのフィルタリング

select * from users where first_name = ANY({{ ['George', 'Chris' ] }})

セキュリティ

Retoolでは、SQLインジェクションを防ぐために、SQLクエリーはプリコンパイル済みの文に変換されます。クエリーが正確に動作するかどうかは、お客様が使用するデータベース・ドライバーによって決まります。しかし、ほとんどのデータベースでは、動的な列名や動的なテーブル名を含むプリコンパイル済みの文はサポートされていません。これは、SQLインジェクションの防止が難しいためです。

つまり、次のような文を記述しても機能しません。テーブル名が動的であり、Postgresでは、プリコンパイル済みの文での動的なテーブル名はサポートされていないためです。

select * from {{textinput1.value === 'getUsers' ? 'users' : 'payments'}}

かわりに、select * from usersおよびselect * from paymentsの2つのSQL文を記述する必要があります。それにより、Tableコンポーネント内で、textinput1の値に応じて正しいSQL文をレンダリングできます。

{{ textinput1.value === 'getUsers' ? users.data : payments.data }}