AlierTable
概要
AlierTable はデータベースの物理テーブル (physical table)または SELECT 文から得られる仮想テーブル (virtual table)を表すオブジェクトのクラスです。
AlierTable のインスタンスは以下のいずれかの方法で生成されます:
AlierDBのメソッドAlierDB.get()を呼び出すAlierTableのメソッドAlierTable.join()を呼び出す
いずれの方法でも返値として AlierTable が得られます。ただし、AlierTable.join() は常に、派生クラスであるVirtualAlierTable のインスタンスを返します。また、AlierDB.get() の引数 columns として選択するカラム名のリストを指定した場合、その結果としてVirtualAlierTable のインスタンスが返ります。これらはオブジェクトの表す対象が物理テーブルではなく仮想テーブルであることを反映しています。
AlierTable を介したテーブルの操作およびデータの問い合わせは、REST 風のインタフェースを介して行えます。すなわち、
- データの問い合わせ(
SELECT)にはget()メソッドを使います - データの挿入(
INSERT)にはpost()メソッドを使います - データの更新(
UPDATE)にはput()メソッドを使います - データの削除(
DELETE)にはdelete()メソッドを使います
またテーブルの結合には join() メソッドを使います。
SQL 式のスクリプト上での表現
WHERE 句および ON 句に指定する条件式として SQL 式の文字列を指定することができます。
これらの条件式は AlierTable から、 WHERE 句について get()、 put()、 delete() メソッドの引数 filter として、ON 句について、join() メソッドの引数 on として指定できます。
SQL式の記述に関する注意点
SQL式の中に固定値の文字列を埋め込む場合、それは SQL の文字列リテラルとして記述する必要があります。
つまり単引用符(')または二重引用符(")で囲まれた文字列であり、文字列中の引用符は連続する単引用符('' / "") としてエスケープされていなければなりません(例:'Maxwell''s Silver Hammer')。
- どちらの引用符を使うかは対向のデータベースおよびその設定に依存します。
- JavaScript において単引用符から始まる文字列リテラルを使う場合、内部の単引用符はバックスラッシュ(
\)でエスケープされる必要があるため、全体としては'Song.title = \'Maxwell\'\'s Silver Hammer\''のような記述になります。- 単引用符だけが問題であれば、これは文字列を二重引用符(
")で開始することで回避できます。 - 二重引用符も使用されるケースでは逆引用符(
`)で囲みテンプレートリテラルとして扱うことで回避できます。
- 単引用符だけが問題であれば、これは文字列を二重引用符(
SQL式の中に下線および英数字(/[_a-zA-Z0-9]/)で表せない識別子を埋め込む場合、その識別子は二重引用符(")または逆引用符(`)で囲まれていなければなりません。
- どちらの引用符を使うかは対向のデータベースおよびその設定に依存します。
- 識別子に含まれる引用符は連続する引用符 (
""/``) としてエスケープされている必要があります(例:"COUNT(""My Number"")")。- JavaScript において二重引用符から始まる文字列リテラルを使う場合、内部の二重引用符はバックスラッシュ(
\)でエスケープされる必要があるため、全体としては"\"COUNT(\"\"My Number\"\")\""のような記述になります。- バックスラッシュによるエスケープの回避方法は単引用符の場合と同様です。
- テンプレートリテラル内で引用符として逆引用符(
`)を使う場合、同様にバックスラッシュによるエスケープが必要です(`\`CaseSensitiveName\``)。
- JavaScript において二重引用符から始まる文字列リテラルを使う場合、内部の二重引用符はバックスラッシュ(
JavaScript風記法
AlierTable が提供するメソッドの中では、SQL 式そのものではなく JavaScript 風の記法を使うこともできます。
WHERE 句について get()、 put()、 delete() メソッドの引数 filter として、ON 句について、join() メソッドの引数 on として指定できます。
以下に示す JavaScript 風の演算は対応する SQL 式に置き換えられます。
| 置換前 | 置換後 |
| :------: | :------: |
== null |
IS NULL |
=== null |
IS NULL |
== undefined |
IS NULL |
=== undefined |
IS NULL |
!= null |
IS NOT NULL |
!== null |
IS NOT NULL |
!= undefined |
IS NOT NULL |
!== undefined |
IS NOT NULL |
== <null / undefined 以外の単語> |
= <null / undefined 以外の単語> |
=== <null / undefined 以外の単語> |
= <null / undefined 以外の単語> |
&& |
AND |
|| |
OR |
! <"=" 以外の文字> |
NOT <"=" 以外の文字> |
- カラム名などに
undefinedを使用する場合、注意が必要です。 JavaScript 風の(否定)等価演算子の右項としてundefinedを記述すると意図しない動作をします。 この問題を回避するには"undefined"のように二重引用符で囲むかUNDEFINEDのように大文字を含める必要があります。- 同様の問題は
nullに関しては生じません。これは SQL のキーワードは大文字小文字の区別がなく、かつNULLが予約語であるため、nullという名前のカラムやテーブルを定義できないためです。
- 同様の問題は
- ヨーダ記法はサポートされていません。例えば
null == xはx IS NULLに置換されません。nullとの比較は常に右辺にnullが置かれるように注意してください(undefinedも同様)。- また同様に、テンプレートリテラルなどを用いて値や識別子を埋め込む際は
null/undefinedでないことを事前に保証する必要があります。
- また同様に、テンプレートリテラルなどを用いて値や識別子を埋め込む際は
メソッド
get()
- 対象のテーブルからレコードを取得します。
put()
- 対象のテーブルから条件に合致するレコードの値を変更します。
post()
- 対象のテーブルにレコードを追加します。
delete()
- 対象のテーブルから、条件に合致するレコードを削除します。
join()
- 対象のテーブルを与えられたテーブルと結合します。
isJoined()
- 対象が結合テーブルかどうかを検査します。
プロパティ
name
テーブル名を表す文字列です。
型
string
alias
テーブルの別名を表す文字列です。
AlierDB.get() の引数 alias を与えた場合にのみ設定されます。
型
string | null
columns
取得対象のカラム名のリストです。
AlierDB.get() の引数 columns を与えた場合にのみ設定されます。
型
Array<string> | null