我想知道在go的內置數據庫/ sql包中使用命名參數的模式。我查看了oracle驅動程序,但它看起來只是C庫的一個包裝。有人以優雅的方式解決了這個問題嗎?到目前爲止,我剛剛通過在單元測試中將{0}
,{1}
作爲參數解決了這個問題,但它肯定能很好地將它們用作map[string]interface{}
或其他東西。有沒有人有一個想法或實施似乎慣用?在數據庫中的命名參數/ sql和數據庫/ sql /驅動程序
供參考,在這裏是一個測試:
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
Yep:https://github.com/wfreeman/cq –
數據庫/ sql包是圍繞位置參數構建的,而不是命名參數。因此,任何使其使用命名參數的解決方法幾乎都是單一的。 – andybalholm