SQLによる読み取り
SQL文によるデータ取得とSQL文の保存
概要
データベースから読み取るには、SQL文を記述します。例えば、次のクエリーはすべてのユーザーを取得します。
select * from users;
このクエリーを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 }}
Updated over 3 years ago