sqlex – RustでSQLの構文チェック&リンターを作った

はじめに

SQLファイルを書いていて、コミット前に構文エラーに気づかず、本番で初めてエラーになる…という経験はないでしょうか。

JavaScriptにはESLint、PythonにはRuff、Goにはgolangciがあるのに、SQLの構文チェッカーって意外と少ない。あっても遅かったり、エラーメッセージがわかりにくかったり。

そこで、Rustで高速に動作するSQLの構文チェッカー&リンター「sqlex」を作りました。

作ったもの

sqlexは以下の機能を持つCLIツールです:

  • 構文チェック: SQLの構文エラーを検出し、エラー箇所をハイライト表示
  • ヒント機能: よくあるミス(カンマの付け忘れなど)を推測して修正案を提示
  • Lint: キーワードの大文字/小文字、SELECT * の禁止などスタイルをチェック
  • 自動修正: Lintエラーを自動で修正
  • 複数方言対応: MySQL、PostgreSQL、SQLite、BigQueryに対応
  • 日本語対応: エラーメッセージを日本語で表示可能

インストール

Homebrewでインストールできます:

brew tap atani/tap
brew install sqlex

使い方

構文チェック

sqlex check query.sql

正常な場合:

✓ query.sql - OK

Total: 1 file(s), 0 error(s)

エラーがある場合:

✗ invalid.sql - 1 error(s)
  Syntax error (line 5, col 6): sql parser error: Expected an expression, found: FROM
  💡 Line 4 may have a trailing comma that should be removed
3 |   name,
4 |   email,  ← check here
5 | FROM users
  |      ^
6 | WHERE active = 1

Total: 1 file(s), 1 error(s)

4行目のカンマが余計だということを、💡ヒントで教えてくれます。

ディレクトリ内の全SQLファイルをまとめてチェックすることもできます:

sqlex check ./sql/
✓ sql/users.sql - OK
✓ sql/orders.sql - OK
✗ sql/products.sql - 1 error(s)
  Syntax error (line 3, col 1): sql parser error: Expected SELECT, found: identifier

Total: 3 file(s), 1 error(s)

Lint

sqlex lint query.sql
⚠ query.sql - 3 warning(s)
  [keyword-case] line 1, col 1 - Keyword 'select' should be 'SELECT'
  [keyword-case] line 2, col 1 - Keyword 'from' should be 'FROM'
  [trailing-semicolon] line 2, col 12 - Missing trailing semicolon

Total: 1 file(s), 3 warning(s)

日本語でメッセージを表示することもできます:

sqlex lint --lang ja query.sql
⚠ query.sql - 3件の警告
  [keyword-case] 1行目:1列目 - キーワード 'select' は 'SELECT' であるべきです
  [keyword-case] 2行目:1列目 - キーワード 'from' は 'FROM' であるべきです
  [trailing-semicolon] 2行目:12列目 - 文末にセミコロンがありません

合計: 1ファイル, 3件の警告

自動修正

sqlex fix --dry-run query.sql
修正予定: query.sql
  - Line 1: select * from users
  + Line 1: SELECT * FROM users;

-f diff オプションで unified diff 形式でも確認できます:

sqlex fix --dry-run -f diff query.sql
--- query.sql
+++ query.sql
@@ -1 +1 @@
-select * from users
+SELECT * FROM users;

問題なければ適用:

sqlex fix query.sql
Fixed query.sql (1 changes)

技術的なポイント

sqlparserクレート

SQLのパースには sqlparser-rs を使用しています。Apache DataFusionでも使われている実績のあるパーサーで、複数のSQL方言に対応しています。

エラーヒントの実装

単にパースエラーを表示するだけでなく、エラーメッセージのパターンからよくあるミスを推測してヒントを出すようにしました。例えば:

  • Expected expression, found: FROM → カンマの付けすぎ
  • Expected SELECT, found: identifier → SELECTの書き忘れ

これにより、初心者でも何を直せばいいかわかりやすくなっています。

CI/CDへの組み込み

GitHub Actionsで使う例:

- name: Check SQL syntax
  run: |
    brew tap atani/tap
    brew install sqlex
    sqlex check ./sql/

おわりに

SQLファイルのチェックをCI/CDに組み込むことで、構文エラーを早期に発見できます。ぜひ試してみてください。

リンク

  • GitHub: https://github.com/atani/sqlex
  • Homebrew: brew tap atani/tap && brew install sqlex

コメント

タイトルとURLをコピーしました