go mysql查询除int以外的任何内容

pw136qt2  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(255)

我已经设置并ping了mysql数据库连接。它正在工作,我可以使用db.query和首先准备一个查询来返回行。我能用占位符吗?然后指定一个id。是否可以使用?作为列名的占位符?在这里的示例中,我试图返回表persons中firstname列的所有行。

qry, err := db.Prepare("SELECT ? FROM persons")
if err != nil { log.Fatal(err) }
defer qry.Close()
rows, err :=qry.Query("firstName")
if err != nil { log.Fatal(err) }
defer rows.Close()

我得到以下错误:错误1064:您的sql语法有错误;请查看与mysql服务器版本对应的手册,以获取在第1行的“?”附近使用的正确语法

mzsu5hc0

mzsu5hc01#

不能将占位符用于标识符(如表和列名),占位符用于值。您可以认为标识符类似于go中的变量或函数名,因此能够为标识符使用占位符类似于拥有 eval 就像在各种脚本语言中一样。
这减少了你使用 fmt.Sprintf 以及类似的字符串操作,用于在运行时之前不知道标识符时构建sql:

col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)

但这会给您带来sql注入和引用问题,因此您需要某种白名单:

quotedColumns := map[string]string{
    "firstName": "`firstName`",
    "lastName": "`lastName`",
    ...
}

quoted, ok := quotedColumns[columnName]
if !ok {
    // Do something with the error here and run away...
}
sql := fmt.Sprintf("select %s from persons", quoted)

注意,我在Map的值中包含了mysql backtick引号。标准接口中没有用于引用/转义标识符的内容,因此您必须自己完成。如果你已经手写了白名单Map,那么你也可以手工引用;否则,您可以通过阅读有关引用的mysql文档并执行几个(希望是)简单的字符串操作来编写自己的标识符引用函数。

相关问题