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

在我的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


智慧大石
浏览 110回答 1
1回答

宝慕林4294392

好吧,我找到了这个问题的解决方案。我在sqlx包的github存储库中找到了讨论。在第一个选项中,我们可以在查询外部对搜索字符串进行串联。这应该仍然安全免受注射攻击。尝试此操作的第二个选择: .正如Bjarni Ragnarsson在评论中所说,PostgreSQL无法推断出.concat( '%', '\', $1::text, '%' )$1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go