在我的Golang(1.15)应用程序中,我使用sqlx包来处理PostgreSQL数据库(PostgreSQL 12.5)。当我尝试使用参数PostgreSQL数据库执行SQL语句时,它会引发错误:错误:无法确定参数 $1 的数据类型 (SQLSTATE 42P18): Pg错误空根据官方文档,此错误意味着通过了。INDETERMINATE DATATYPE具有值。它不是空/无或空的。此外,其数据类型是 简单的内置数据类型 。organizationId*string具有查询方法的代码段:rows, err := cr.db.Query(` select channels.channel_id::text, channels.channel_name::text from channels left join organizations on channels.organization_id = organizations.organization_id where organizations.tree_organization_id like concat( '%', '\', $1, '%' );`, *organizationId)if err != nil { fmt.Println(err)}我也尝试使用,但它也会引起错误:NamedQuery错误:在“:”处或附近出现语法错误 (SQLSTATE 42601): PgError null使用 NamedQuery 方法的代码段:args := map[string]interface{}{"organization_id": *organizationId}rows, err := cr.db.NamedQuery(` select channels.channel_id::text, channels.channel_name::text from channels left join organizations on channels.organization_id = organizations.organization_id where organizations.tree_organization_id like concat( '%', '\', :organization_id, '%' );`, args)if err != nil { fmt.Println(err)}很有可能,参数没有正确地传递给我的请求。有人可以解释如何解决这种奇怪的行为吗?附言我必须马上说,我不想通过 或通过该方法形成sql查询。这并不安全。concatenationfmt.Sprintf
1 回答
宝慕林4294392
TA贡献2021条经验 获得超8个赞
好吧,我找到了这个问题的解决方案。
我在sqlx包的github存储库中找到了讨论。
在第一个选项中,我们可以在查询外部对搜索字符串进行串联。这应该仍然安全免受注射攻击。
尝试此操作的第二个选择: .正如Bjarni Ragnarsson在评论中所说,PostgreSQL无法推断出.concat( '%', '\', $1::text, '%' )
$1
- 1 回答
- 0 关注
- 109 浏览
添加回答
举报
0/150
提交
取消