首页 > 解决方案 > 在不使用 fmt.Sprintf 的情况下构建 Sql Select Query

问题描述

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

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

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 驱动程序中的所有示例代码后,我意识到我无法动态地将选择部分与准备好的语句中的参数绑定(如果我错了,请纠正我)。我认为这可以作为?标记在哪里条件。

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

标签: mysqlgo

解决方案


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

请参阅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)

推荐阅读