在Go中编写文本SQL查询的正确方法

时间:2016-03-20 05:38:10

标签: go

我找不到使用值连接文本查询的字符串部分的正确方法的一个很好的例子。例如:

query := `SELECT column_name FROM table_name
        WHERE column1_name = %d AND column2_name = %d` % (val1, val2)
rows, res, err := db.Query(query)

这不起作用。编译器返回syntax error: unexpected comma, expecting ) 可能是因为我正在尝试使用python样式元组。

如果我将其重写为

query := `SELECT column_name FROM table_name
        WHERE column1_name = %d AND column2_name = %d` % val1

我得到(mismatched types string and int)告诉我元组是其中一个问题。

如果我先将参数转换为字符串,我会得到(operator % not defined on string)

在python中,你会做类似

的事情
query = """SELECT column_name FROM table_name
    WHERE column1_name = %d
    AND column2_name = %d""" % (val1, val2)

OR

query = """SELECT column_name FROM table_name
    WHERE column1_name = %s
    AND column2_name = %s""" % (val1_string, val2_string)

我知道我可以将值转换为字符串并使用"STRING" + var + "STRING"进行连接,但与python版本相比,这似乎非常混乱。 Go中的python代码相当于什么?具体包括元组部分,并连接字符串和整数。

1 个答案:

答案 0 :(得分:5)

&LT;由于注入漏洞而导致使用字符串插值和SQL语句的标准警告<>

您可以使用fmt.Sprintf来处理此问题。

query := fmt.Sprintf(`SELECT columnA FROM tableA WHERE columnB = %d AND columnB = %s`,
                     someNumber, someString)

为避免注入问题,请将您的第一个代码写为:

query := `SELECT column_name FROM table_name
    WHERE column1_name = %d AND column2_name = %d`

rows, err := db.Query(query, val1, val2)