gpt4 book ai didi

sql - database/sql 和 database/sql/driver 中的命名参数

转载 作者:IT王子 更新时间:2023-10-29 01:22:56 26 4
gpt4 key购买 nike

我试图弄清楚在 go 的内置数据库/sql 包中使用命名参数的模式是什么。我查看了 oracle 驱动程序,但它似乎只是 C 库的包装器。人们是否以优雅的方式解决了这个问题?到目前为止,我只是通过将 {0}{1} 作为单元测试中的参数解决了这个问题,但如果能够通常将它们用作 map[string]interface{} 或其他东西。有没有人有看似惯用的想法或实现?

作为引用,这里有一个测试:

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
}
...

最佳答案

我在名为 sqlx 的数据库/sql 之上使用包装器 https://github.com/jmoiron/sqlx您可以在此处查看他是如何做到的。

关于如何选择元组的示例

type Person struct {
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
Email string
}
jason = Person{}
err = db.Get(&jason, "SELECT * FROM person WHERE first_name=$1", "Jason")
fmt.Printf("%#v\n", jason)
// Person{FirstName:"Jason", LastName:"Moiron", Email:"jmoiron@jmoiron.net"}

关于如何插入元组的示例

dude := Person{
FirstName:"Jason",
LastName:"Moiron",
Email:"jmoiron@jmoiron.net"
}
_, err = db.NamedExec(`INSERT INTO person (first_name,last_name,email) VALUES (:first,:last,:email)`, dude)

关于sql - database/sql 和 database/sql/driver 中的命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20456053/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com