Documentation ¶
Overview ¶
sqlb パッケージは SQL 操作のユーティリティを提供します.
sqlb は ORM (Object-Relational Mapping) のような大規模な仕組みではなく、 Go 標準パッケージの database/sql を容易に扱うためのユーティリティ群です.
MySQL で使用する場合 次の import を追加してください.
import _ "github.com/17e10/b/sqlb/dialect/mysql"
Sqler ¶
SQL を動的に組み立てる仕組みに Sqler インターフェイスを導入しています.
type Sqler interface { Sql(w Writer) error }
Sqler は SQL 文字列が必要になったときに Writer に SQL を出力していくことで 高速かつメモリ効率よく SQL を生成します.
SQL 記述 ¶
動的な SQL を簡潔に記述できる T 関数, M 関数を提供しています. これらの関数は SQL テンプレートに値や識別子, SQL を展開をできます. 構文は非常にシンプルながらとても柔軟かつ強力です.
値の展開: @
1つの値を展開:
nil T("@", nil) NULL 整数 T("@", 123) 123 浮動小数点 T("@", 123.45) 123.45 文字列 T("@", "abc") 'abc' ブール値 T("@", false) FALSE バイト列 T("@", []byte{0x41, 0x42, 0x43}) X'414243' 日付時刻 T("@", time.Time{}) '2001-01-02 13:14:15.678901'
特別な展開:
値リスト T("@", []any{"a", "b"}) 'a', 'b' グループリスト T("@", [][]any{{"a", "b"}, {"c", "d"}}) ('a', 'b'), ('c', 'd') Key-Value ペアリスト T("@", []Kv{{"k1", "v1"}, {"k2", "v2"}}) `k1` = 'v1', `k2` = 'v2'
識別子の展開: #
1つの識別子を展開:
識別子 T("#", "a") `a` フィールドリスト T("#", []string{"a", "b"}) `a`, `b`
SQL の展開: $
SQL T("WHERE $", sqler) WHERE `a` = b
擬似イコール構文: == @, !== @
= T("== @", "a") = 'a' != T("!== @", "a") != 'a' IN (...) T("== @", []any{"a", "b"}) IN ('a', 'b') NOT IN (...) T("!== @", []any{"a", "b"}) NOT IN ('a', 'b') IS NULL T("== @", nil) IS NULL IS NOT NULL T("!== @", nil) IS NOT NULL
Index ¶
- Variables
- func Columns[V any](v *V, excludes ...string) []string
- func Compact(s string) string
- func Exec(conn sqlt.Execer, ctx context.Context, sqler Sqler) (sql.Result, error)
- func GroupValues[V any](v []V, excludes ...string) [][]any
- func Query(conn sqlt.Queryer, ctx context.Context, sqler Sqler) (*sql.Rows, error)
- func QueryRow(conn sqlt.QueryRower, ctx context.Context, sqler Sqler) *sql.Row
- func Scan[V any](row sqlt.RowsScanner, dest *V) error
- func Stringify(sqler Sqler) (string, error)
- func Values[V any](v *V, excludes ...string) []any
- type Kv
- type Sqler
- type SqlerFunc
- type StringSqler
- type Writer
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ColumnCase = nameb.Snake
ColumnCase は sqlb が生成するカラム名の形式を保持します.
Functions ¶
func Scan ¶
func Scan[V any](row sqlt.RowsScanner, dest *V) error
Scan は database/sql の Row(s).Scan メソッドの結果を構造体に入れます.
Scan で受け取るフィールド順序は Columns で生成されるカラム列の順序と一致します.
Example ¶
var person struct { ID uint64 GivenName string FamilyName string } // クエリを実行する // SELECT id, given_name, family_name FROM person ORDER BY id rows, err := sqlb.Query(conn, ctx, sqlb.T( "SELECT # FROM person ORDER BY id", sqlb.Columns(&person), )) if err != nil { return } defer rows.Close() // Rows を読む for rows.Next() { if err = sqlb.Scan(rows, &person); err != nil { return } fmt.Printf("%#v\n", &person) }
Output:
Types ¶
type Sqler ¶
Sqler は SQL を構築するインターフェイスを表します.
func M ¶
M は名前付きプレースホルダを展開します.
M は比較的長い SQL を記述するための関数です. tmpl には次の構文が利用できます.
$sqler_name // Sqler #ident_name // 識別子 @value_name // 値
Example ¶
var extra []sqlb.Sqler // 追加条件1 オーストラリア出身 extra = append(extra, sqlb.T("birthplace = @", "Australia")) // 追加条件2 A から始まる名前 extra = append(extra, sqlb.T("(@ <= given_name AND given_name < @)", "A", "B")) query := sqlb.M(` SELECT given_name, family_name FROM person WHERE gen = @gen AND $extra `, map[string]any{ "@gen": 3, "$extra": sqlb.And(extra...), }) s, _ := sqlb.Stringify(query) fmt.Println(sqlb.Compact(s))
Output: SELECT given_name, family_name FROM person WHERE gen = 3 AND birthplace = 'Australia' AND ('A' <= given_name AND given_name < 'B')
func T ¶
T はプレースホルダを展開します.
T は比較的短い SQL を簡潔に記述するための関数です. tmpl には次の構文が利用できます.
$(index) // Sqler #(index) // 識別子 @(index) // 値
index は省略可能で 省略した場合は引数の先頭から順に展開します. index を指定した場合は指定した位置の引数から順に展開します.
Example ¶
type person struct { Id uint64 GivenName string FamilyName string Age int } persons := []person{ {1, "Olivia", "Williams", 54}, {2, "Kenny", "Loggins", 75}, } query := sqlb.T( "INSERT INTO person (#) VALUES @", sqlb.Columns((*person)(nil), "id"), sqlb.GroupValues(persons, "id"), ) s, _ := sqlb.Stringify(query) fmt.Println(sqlb.Compact(s))
Output: INSERT INTO person (`given_name`, `family_name`, `age`) VALUES ('Olivia', 'Williams', 54), ('Kenny', 'Loggins', 75)
type StringSqler ¶
type StringSqler string
StringSqler は Sqler インターフェイスを持つ文字列型です.
func (StringSqler) Sql ¶
func (s StringSqler) Sql(w Writer) error