Golang调用sql包Query方法时遭遇SQL语法错误求助
PostgreSQL 表名占位符报错解决
问题代码与错误
代码:
rows, err := r.db.Query(`SELECT * FROM ?`, couriersTable)
运行报错:
pq: syntax error at or near "?"
尝试替换为%s后问题依旧。
原因与解决方案
PostgreSQL的参数占位符(包括?或pq驱动标准的$1)仅支持替换数据值,不能用于替换表名、列名这类SQL标识符。
解决方式:
- 安全拼接表名:如果表名是可控的(非用户输入),可以直接拼接,但建议用
pq.QuoteIdentifier做转义,避免标识符包含特殊字符或注入风险:
import "github.com/lib/pq" // 转义表名,避免语法错误和注入 safeTable := pq.QuoteIdentifier(couriersTable) query := fmt.Sprintf(`SELECT * FROM %s`, safeTable) rows, err := r.db.Query(query)
- 校验表名合法性:如果表名来自用户输入,必须先校验是否在预设的允许列表中,再进行拼接转义,彻底杜绝SQL注入风险。
内容的提问来源于stack exchange,提问作者Vladimir Chizh
相关产品推荐
相关产品推荐

