【问题标题】:Passing Variable to GoLang Query将变量传递给 GoLang 查询
【发布时间】:2015-05-19 09:16:43
【问题描述】:

首先让我说我是 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 的过程中,我们将不胜感激!

【问题讨论】:

标签: mysql go


【解决方案1】:

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

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

我认为它应该以 sql 安全的方式将 ? 替换为 userId

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

【讨论】:

  • 正确。 ?是mySQL使用的参数格式,$1, $2, etc.是PostgreSQL格式。 OP 应该从不(永远!)使用除参数化之外的任何东西,否则它们会受到 SQL 注入攻击。
  • 感谢您的帮助。 @elithrar 我在上面的示例中进行了正确的参数化吗?前任。 var userId = params["user"]
  • 我所说的参数化是在你的 SQL 查询中——而不是你的 Go 代码。您应该阅读blog.codinghorror.com/… 以更好地理解我的意思以及您为什么要这样做。
【解决方案2】:

你可以这样试试。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2016-12-19
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多