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