以前からscala-jdbcというScala用のシンプルなJDBCラッパーを作っています。
この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"