Scalaでコンパイル時にSQLをバリデーションするマクロを作ってみた

以前からscala-jdbcというScala用のシンプルなJDBCラッパーを作っています。

github.com

このscala-jdbcコンパイル時にSQLのバリデーションを行うためのマクロを追加してみました。

たとえば以下のように少し間違ったSQLカラム名の後ろに余計なカンマが付いている)を記述したとします。

sqlc("SELECT USER_ID, FROM USER")

するとコンパイル時に以下のようなエラーが報告されます。

[error] /Users/takezoe/gitwork/scala-jdbc/src/test/scala/com/github/takezoe/scala/jdbc/validation/SqlValidationSpec.scala:30: Encountered " <S_IDENTIFIER> "USER "" at line 1, column 40.
[error] Was expecting one of:
...
[error]     
[error]     sqlc("SELECT USER_NAME, FROM USER")
[error]         ^

デフォルトではSQLシンタックスのみがチェックされますが(SQLのパースにはJSqlParserを使っています)、コンパイル時のカレントディレクトリにschema.jsonというファイルを作っておくことでテーブルやカラムの存在チェックを行うこともできます。schema.jsonは以下のような感じです。

{
  "tables":[
    {
      "name": "USER",
      "columns": [
        { "name": "USER_ID" },
        { "name": "USER_NAME" },
        { "name": "COMPANY_ID" }
      ]
    },
    {
      "name": "COMPANY",
      "columns": [
        { "name": "COMPANY_ID" },
        { "name": "COMPANY_NAME" }
      ]
    }
  ]
}

なお、このマクロはまだ実験的な機能なのでscala-jdbcのSNAPSHOTバージョンでのみ提供されています。build.sbtには以下の依存関係を追加します。

resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"

libraryDependencies += "com.github.takezoe" %% "scala-jdbc" % "1.0.3-SNAPSHOT"

もし不正なバリデーション結果に遭遇した場合はGitHubIssuesでレポートをいただければと思います。