【问题标题】:Build Sql Select Query without using fmt.Sprintf [duplicate]在不使用 fmt.Sprintf 的情况下构建 Sql Select Query [重复]
【发布时间】:2021-07-24 00:49:04
【问题描述】:

长话短说,我想用准备好的语句或其他任何东西而不是使用 fmt.Sprintf 来更改 sql 查询的选择部分,因为我不希望用户输入直接进入查询。

我正在尝试根据用户的请求从数据库中选择两个特定的列。如果我像这样对列名进行硬编码(我简化了这个问题的查询),它工作得很好:

query := `SELECT
   m.first_name,
   m.created_at
FROM
   member AS m
INNER JOIN device AS d
   ON d.member_id = m.member_id`
WHERE m.member_id = ?

但是,如果我使用这个查询,它就不起作用:

query := `SELECT
   m.?,
   m.created_at
FROM
   member AS m
INNER JOIN device AS d
   ON d.member_id = m.member_id`
WHERE m.member_id = ?

对于这两个查询,我使用*sql.DB.QueryContext 将占位符与参数绑定:db.QueryContext(ctx, query, args)。在查看了 sql 驱动程序中的所有示例代码后,我意识到我无法动态地将选择部分与准备好的语句中的参数绑定(如果我错了,请纠正我)。我认为这可以作为?标记 where 条件。

database/sql package 中是否有更好的方法来动态构建 Sql Select 部分而不直接在查询中使用用户输入?

【问题讨论】:

  • 问号是什么?一个不能与准备好的语句一起使用的占位符。
  • @nbk 我想根据用户输入(如名字、昵称或以前的名字)动态传递列名。我发现占位符在选择查询中不起作用,所以我问是否有更好的方法来动态构建选择部分。
  • 看我的回答,占位符无法做到这一点。

标签: mysql go


【解决方案1】:

您不能以这种方式使用占位符来替换值而不是列名或表名

http://go-database-sql.org/prepared.html

MySQL               PostgreSQL            Oracle
=====               ==========            ======
WHERE col = ?       WHERE col = $1        WHERE col = :col
VALUES(?, ?, ?)     VALUES($1, $2, $3)    VALUES(:val1, :val2, :val3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 2021-07-12
    • 2011-08-02
    • 2021-06-04
    • 2020-10-30
    相关资源
    最近更新 更多