【发布时间】: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 我想根据用户输入(如名字、昵称或以前的名字)动态传递列名。我发现占位符在选择查询中不起作用,所以我问是否有更好的方法来动态构建选择部分。
-
看我的回答,占位符无法做到这一点。