【问题标题】:Correct way to write a text SQL query in Go在 Go 中编写文本 SQL 查询的正确方法
【发布时间】:2016-03-20 14:08:32
【问题描述】:

我找不到一个很好的例子来说明将文本查询的字符串部分与值连接起来的正确方法。例如:

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)

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 代码相当于什么?具体包括元组部分,并连接一个字符串和一个整数。

【问题讨论】:

  • 您在寻找Sprintf吗?
  • 有一个很棒的视频,我也想给你参考一下,它是关于如何在 golang 中使用数据库的:youtube.com/watch?v=m879N2rzn2g

标签: go


【解决方案1】:

您可以使用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)

【讨论】:

  • 如果您对此不熟悉,SQL 注入会为终止并运行另一个命令的查询提供特制值,例如1; DROP TABLE tableA。现在,当您运行看似良性的选择查询时,它实际上会丢弃您的表。
  • @jniedrauer 效果很好!但这与你正在做的相反:)。任何生产 SQL API 都将具有防注入插值选项。在语言中执行此操作(即使是在 Python 中,就像您在上面所做的那样)很容易注入。
  • 取自 bobby-tables.com:# Do NOT do it this way.cmd = "update people set name='%s' where id='%s'" % (name, id)curs.execute(cmd)#Instead, do this:cmd = "update people set name=%s where id=%s"curs.execute(cmd, (name, id)) 但我看不到用 Go 的 MyMySQL 做这件事的方法。也许我只是对 RTFM 不够努力。我专门将用户输入转换为整数,以防止在此代码片段之前注入。我想我真的只需要知道在 MyMySQL 中编写文本查询的正确方法...
  • @jniedrauer 请参阅database/sql/DB.Query 的文档。您将参数传递给查询本身,而不是手动插入字符串。
  • 现在我觉得自己像个白痴。有用。世界各地的数据库感谢您保护它们的安全。
猜你喜欢
  • 2010-11-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
相关资源
最近更新 更多