在Go中动态传递SQL参数



我有下面的Go程序,它可以很好地动态传递一个参数。在我的需求中,我不会提前知道参数名和参数值。我可能需要通过1…N参数的查询和值为动态方式。我怎样才能达到同样的效果呢?

import (
"database/sql"
"fmt"
)
func main() {
// Open a connection to the database
db, err := sql.Open("mysql", "user:password@tcp(host:port)/database")
if err != nil {
panic(err)
}
defer db.Close()
// Prepare the SQL statement with placeholders for the parameters
stmt, err := db.Prepare("SELECT * FROM mytable WHERE mycolumn = ?")
if err != nil {
panic(err)
}
defer stmt.Close()
// Execute the SQL statement with the parameter values
rows, err := stmt.Query("myvalue")
if err != nil {
panic(err)
}
defer rows.Close()
// Iterate over the result set
for rows.Next() {
var id int
var name string
err := rows.Scan(&id, &name)
if err != nil {
panic(err)
}
fmt.Println(id, name)
}
if err = rows.Err(); err != nil {
panic(err)
}
}

最简单的方法是使用Squirrel。您可以像readME.md中给出的示例那样添加条件查询。

if len(q)>0 {users = users. where ("name LIKE ?", fmt.Sprint("%", q, "%"))}

我对Go知之甚少(我在这里是因为我知道SQL Server),但我可以找到文档,并看到这个:

Query使用给定的参数执行准备好的查询语句

使用复数"argument"而不是"argument",再加上我在其他环境中使用?占位符的经验,告诉我可以向Query()传递多个参数,它们将被解释为位置参数:

stmt.Query("myvalue1", "myvalue2",.... "myvaluen")

其中myvalue1匹配SQL命令字符串中第一个准备的?占位符,myvalue2匹配第二个占位符,以此类推。

我想你知道这一点,但为了完整,我需要补充:doNOT使用字符串操作在SQL命令中包含这些值。

最新更新