我已经设置并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行的“?”附近使用的正确语法
1条答案
按热度按时间mzsu5hc01#
不能将占位符用于标识符(如表和列名),占位符用于值。您可以认为标识符类似于go中的变量或函数名,因此能够为标识符使用占位符类似于拥有
eval
就像在各种脚本语言中一样。这减少了你使用
fmt.Sprintf
以及类似的字符串操作,用于在运行时之前不知道标识符时构建sql:但这会给您带来sql注入和引用问题,因此您需要某种白名单:
注意,我在Map的值中包含了mysql backtick引号。标准接口中没有用于引用/转义标识符的内容,因此您必须自己完成。如果你已经手写了白名单Map,那么你也可以手工引用;否则,您可以通过阅读有关引用的mysql文档并执行几个(希望是)简单的字符串操作来编写自己的标识符引用函数。