mysql - 在不使用 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 部分而不直接在查询中使用用户输入?
解决方案
您不能以这种方式使用占位符来替换值而不是列名或表名
请参阅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)
推荐阅读
- python - 在被 rasa-nlu 模型分类为哪个意图之前,如何(编辑或处理)来自用户的消息?
- vue.js - Vue 组件的行为可以像 wordpress 短代码属性一样吗
- laravel - Laravel Query n+1 - 查询自定义属性关系计数
- c# - 如何为 1 箱推箱子实现快速最短路径搜索?
- php - 如何阻止 Wordpress 尝试使用 Wordpress.org 上的主题更新我的主题
- excel - 从函数返回不同的类型
- html - 尝试使用 div 创建相机快门效果
- html - 我在测试中看到了这个问题:如何使文本在单击时出现在区域中,仅使用 HTML?
- gradle - 为什么直接调用 groovy 闭包不起作用,但使用 .call() 可以?
- java - 如何模拟包含可以抛出 NPE 的变量的类