Tôi đang cố gắng tìm ra mẫu là gì để sử dụng các tham số có tên trong gói cơ sở dữ liệu/sql được tích hợp sẵn. Tôi nhìn vào trình điều khiển oracle, nhưng nó có vẻ giống như một wrapper cho thư viện C. Có người giải quyết điều này một cách thanh lịch? Cho đến nay tôi đã chỉ giải quyết vấn đề bằng cách đặt {0}
, {1}
làm tham số trong các bài kiểm tra đơn vị, nhưng chắc chắn sẽ rất tuyệt khi có thể sử dụng chúng như là map[string]interface{}
hoặc một cái gì đó. Có ai có một ý tưởng hoặc một thực hiện có vẻ thành ngữ?các tham số có tên trong cơ sở dữ liệu/sql và cơ sở dữ liệu/sql/driver
Để tham khảo, đây là một thử nghiệm:
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)
}
Và những gì tôi đang làm trong Query
là:
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
}
...
Các câu trả lời hiện có dường như giả định rằng bạn đang viết một ứng dụng khách, nhưng có vẻ như tôi đang viết một trình điều khiển. Có đúng không? – andybalholm
Yep: https://github.com/wfreeman/cq –
Gói cơ sở dữ liệu/sql được xây dựng xung quanh các tham số vị trí, không được đặt tên tham số. Vì vậy, bất kỳ workaround để làm cho nó sử dụng các thông số được đặt tên sẽ được unidiomatic gần như theo định nghĩa. – andybalholm