goの組み込みデータベース/ sqlパッケージで名前付きパラメータを使用するためのパターンを理解しようとしています。私はoracleドライバを調べましたが、Cライブラリのラッパーのように思えます。人々はこれを優雅な方法で解決しましたか?これまでのところ、私はちょうど{0}
、{1}
をユニットテストのパラメータとして入力することで問題を回避しましたが、通常はmap[string]interface{}
などのように通常使うことができればいいと思います。誰でもアイデアやイディオムのような実装がありますか?参考のため、ここではテストdatabase/sqlとdatabase/sql/driverの名前付きパラメータ
されています:
db := testConn()
stmt, err := db.Prepare("return {0} as int1, {1} as int2")
if err != nil {
t.Fatal(err)
}
rows, err := stmt.Query(123, 456)
if err != nil {
t.Fatal(err)
}
rows.Next()
var test int
var test2 int
err = rows.Scan(&test, &test2)
if err != nil {
t.Fatal(err)
}
if test != 123 {
t.Fatal("test != 123;", test)
}
if test2 != 456 {
t.Fatal("test2 != 456;", test2)
}
そして私はQuery
でやっては以下のとおりです。
func (stmt *cypherStmt) Query(args []driver.Value) (driver.Rows, error) {
cyphReq := cypherRequest{
Query: stmt.query,
}
if len(args) > 0 {
cyphReq.Params = make(map[string]interface{})
}
for idx, e := range args {
cyphReq.Params[strconv.Itoa(idx)] = e
}
...
既存の回答は、あなたがクライアントを書いていると仮定しているようですが、ドライバを書いているように見えます。そうですか? – andybalholm
はい:https://github.com/wfreeman/cq –
データベース/ sqlパッケージは、名前付きパラメータではなく、位置パラメータを中心に構築されています。ですから、名前付きパラメータを使用するための回避策は、定義によってはほぼ独立したものになります。 – andybalholm