将变量传递到GoLang查询

9
首先,我想说我是一个初学者(几天前开始)使用golang,并正在学习如何实际应用该语言。我的目标是构建一个Web Rest API,查询数据库并向用户提供数据。
我已成功使用martini(https://github.com/go-martini/martini)创建了一个简单的API,并使用https://github.com/go-sql-driver/mysql连接到MySQL数据库。我当前的问题是如何将API请求中的变量参数传递到我的查询中。以下是我的当前代码:
package main

import (
    "github.com/go-martini/martini"
    _ "github.com/go-sql-driver/mysql"
    "database/sql"
    "fmt"
)

func main() {

  db, err := sql.Open("mysql",
    "root:root@tcp(localhost:8889)/test")

  m := martini.Classic()

  var str string

  m.Get("/hello/:user", func(params martini.Params) string {

  var userId = params["user"] 

  err = db.QueryRow(
      "select name from users where id = userId").Scan(&str)

  if err != nil && err != sql.ErrNoRows {
    fmt.Println(err)
  }

  return "Hello " + str

  })

  m.Run()


  defer db.Close()  

}

如您所见,我的目标是将输入变量(用户)插入到一个名为userId的变量中。然后,我想针对该变量查询数据库以获取名称。一旦所有工作都完成了,我想回复用户的姓名。
有人可以帮忙吗?非常感谢,因为我继续学习Go!

你可能会发现以下资源在你的SQL+go冒险中非常有用:http://go-database-sql.org/ - Zhube
2个回答

19

我没有使用过它,但看文档,这是你想要的吗?

db.QueryRow("SELECT name FROM users WHERE id=?", userId)

我假设这应该以一种安全的方式,通过将 ? 替换为 userId,在 SQL 语句中实现。

http://golang.org/pkg/database/sql/#DB.Query


6
正确。? 是mySQL使用的参数格式,而 $1,$2 等则是PostgreSQL的格式。提问者绝不能(绝对不能!)使用除参数化外的任何方式,否则将面临SQL注入攻击。 - elithrar
谢谢,帮了我很多。@elithrar,在上面的例子中,我是否正确地进行了参数化处理?例如: var userId = params["user"] - viablepath
我所说的参数化是指你的SQL查询,而不是你的Go代码。你应该阅读http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/以更好地理解我的意思以及为什么要这样做。 - elithrar

1
你可以尝试这样做。
var y string // Variable to store result from query.
err := db.QueryRow("SELECT name from user WHERE id = $1", jobID).Scan(&y)
if err != nil && err != sql.ErrNoRows {
    fmt.Println(err)
}   

文档参考: https://pkg.go.dev/database/sql#pkg-variables

该文档为IT技术相关内容,涉及sql数据库操作。请参考上方链接了解更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接