为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过 Golang 中的 sqlx 包将参数正确地传递给 SQL 请求?

如何通过 Golang 中的 sqlx 包将参数正确地传递给 SQL 请求?

Go
智慧大石 2022-08-24 12:49:38
在我的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


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信