このプロジェクトについて
# bisql
bisqlは、Go向けの双方向SQLテンプレートエンジンです。SQLクライアントで実行可能な有効なSQL文でありながら、アプリケーション向けのパラメータ化されたクエリビルダーとしても機能するSQLテンプレートを作成できます。ディレクティブはSQLコメントとして表現されるため、同じテキストが両方のコンテキストで機能します。
## 主な機能
- **双方向SQL**: テンプレートは有効なSQL文です。ディレクティブはコメントです。同じテキストがクライアント(サンプル値を使用)で実行され、Goでパラメータ化されたステートメント `(SQL, Args)` を構築します。
- **明示的なモデル**: 空の句やぶら下がりコネクタの暗黙的な削除はありません。作成者は、予測可能な出力のために動的フラグメント(例:`1 = 1`)をアンカーします。
- **ディレクティブ**: バインド(`/* expr */リテラル`)、リテラル補間(`/*^ expr */リテラル`)、条件分岐(`/*%if*/`、`/*%elseif*/`、`/*%else*/`、`/*%end*/`)、ループ(`/*%for x in xs*/`)、インクルード(`/*%! @include name */`)。
- **フラグメントのインクルード**: `@include` で構成される再利用可能なSQLフラグメント。`fs.FS`、インメモリレジストリ、またはカスタムローダーから解決されます。サイクル/深さガード付きの再帰をサポートします。
- **方言サポート**: MySQL、SQLite、PostgreSQL、Oracle、SQL Server向けのプレースホルダー生成。PostgreSQL向けの配列バインディング。
- **式言語**: 条件と反復可能オブジェクトにexpr-langを使用し、比較、論理演算、オプショナルチェーン、nil合体、`in`、`len` をサポートします。
- **安全設計**: 任意の値の生テキスト置換はありません。動的識別子は `/*%if*/` ブランチを介してホワイトリストに登録する必要があります。
## 使用方法
テンプレートは `.sql` ファイルです。任意の `fs.FS`(例:埋め込み)から `ParseFile` で解析し、パラメータマップまたは構造体でビルドします。
```go
p := bisql.NewParser(bisql.WithDialect(dialect.PostgreSQL))
tmpl, err := p.ParseFile(sqlFS, "users/search.sql")
stmt, err := tmpl.Build(map[string]any{"name": "Alice", "activeOnly": true, "status": "active"})
fmt.Println(stmt.SQL) // パラメータ化されたSQL
fmt.Println(stmt.Args) // バインド引数
```
## 作成ルール
- 動的フラグメントをアンカーします(例:`AND` チェーンには `1 = 1`、`OR` チェーンには `1 = 0`)。
- リストには、先頭のコネクタ(`and`/`or`)またはゼロ行シードからの `union all select` をカンマ区切りリストに使用します。
- 文字列/識別子はSQL標準の二重化で引用します。バックスラッシュエスケープは認識されません。
- パーサーコメント(削除)には `/*%! … */` を、通常のブロックコメントには `/** … */` を使用します。
## パッケージ構成
- `bisql`: 公開API(Parser、Parse、Expand、ローダー)。
- `dialect/`: 方言定義。
- `expr/`: 評価インターフェースとスコープ。
- `internal/`: テンプレートレイヤーとデフォルト評価器。
## 開発
ツールチェーンは `mise.toml` で固定されています。`mise run check` でフォーマット、ビルド、vet、lint、テストを実行します。PostgreSQLを使用した統合テストには、ビルドタグとDSNが必要です。
完全なドキュメントについては、[Go Reference](https://pkg.go.dev/github.com/mpyw/bisql) を参照してください。
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.