同じなわけがない。
話半分でどうぞ。
どういうこと?
ホスト言語とは違う言語を組み立てるという点が同じだよねって話。
- SQL を組み立てて、RDB に渡す
- HTML を組み立てて、クライアントに渡す
この流れが同じ。
HTML と比べて、まだまだ SQL を使うにあたっての改善ポイントがあるのではないかと思っている。
HTML 組み立ての歴史
詳しい歴史は知らないので雑にまとめる。
最初は Perl CGI で文字列を組み立てていた。
次に、テンプレートエンジンを使ったサーバー変数の埋め込みを活用。
今主流なのは、フロントエンドは完全に分離して Ajax でデータを取得するやり方だろうか。
近しいところでは、SSR 中にサーバーから直接データを受け取るやり方もある。
最近話題なのは、フロントエンドのコードに見えるのにサーバーサイドで動く React Server Components。
このように、HTML の組み立てという点において、だいぶ大きな変革が起こっていると感じている。
SQL 組み立ての歴史
こちらは本当に知らないエアプなので、間違ってたらすみません。
一番シンプルなのは SQL を文字列で組み立てることだろうか。
Ruby on Rails の Active Record に代表される ORM は一時期とても流行った。
現代で多く採用されているのは、おそらく SQL ビルダーなような気がする。
SQL 組み立ての未来
ホスト言語とは違う言語を組み立てるという点では同じはずなのに、かなりの差が生まれてしまっている。
クライアントが直接触る UI を構築する言語と、サーバー内で RDB へのリクエストに使われる言語だと、前者のほうが進化が早いのは当たり前だろう。
でも SQL だって進化したい!(個人の感想です)
ということで考えてみた。
テンプレートエンジン
一番最初に思いつくのがこれ。
SQL を別ファイルにして、そこに特殊な構文で変数を埋め込めるようにしたもの。
進化先としては分かりやすいのでは?
select * from user where user_id = {- props.userId -} {- if !props.includeAll -} and deleted_at = null {- fi -} ;
どうでもいいけど、シェルの if
に対して fi
ってするやつ好き(微妙に読みづらいけど)
テンプレートリテラル
すでにありそう。
ファイルを分ける必要がないのは、メリットかもしれないしデメリットかも。
条件分岐をすると、結局文字列として書かないといけないのが悩ましい。
sql` select * from user where user_id = {userId} {includeAll ? "" : "and deleted_at = null"} `
JSX 風
今どきの流行に乗ってみる。
JSX は HTML タグの形式が JS の構文に出てこないから判別できるのであって、SQL のような普通の文字の並びだと無理では。
これができたら(現状の)理想かもしれないが、実現可能性が低い。
const result = sql( select * from user where user_id = {userId} {includeAll || deleted_at = null} )
おわりに
フロントエンドエンジニアがサラッと考えただけなので、穴があるかもしれない。
そもそもサーバーサイドを触ってる人にとって、問題になってないのかもしれない。
でも考えたかったんや。楽しかったのでよし。