はじめに
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

コメント