首页 > 解决方案 > pgxpreparedStatement 执行不返回结果(与 fmt.Sprintf 不同)

问题描述

出于某种原因,我使用 pgx 在 go 中构建的 prepareStatement 没有返回任何结果/行(参见场景 1)。在场景 2 中,如果我使用 Sprintf 和 $ 构建相同的查询,也不会返回结果。

但是,如场景 3 所示,如果我使用带有 %s 占位符的 Sprintf 构建查询并执行它,它将返回结果/行。

我想使用场景 1 的“逻辑”构建/执行查询(使用准备好的语句而不是使用 Sprintf)。有任何想法吗?

我直接在数据库上测试了查询(使用 pgadmin),它有数据/结果。

假设: 我怀疑它可能与以下内容有关:

详细信息: 数据库是 postgres,表 t 具有以下字段类型:

情景 1

func prepareQuery(cp *pgx.ConnPool) (string, error) {
    prep := `SELECT DISTINCT
        A,B,C
        FROM table t
        WHERE t.str1 = $1
        AND t.properties IN ($2)
        AND t.my_uuid = $3`

    _, err := cp.Prepare("queryPrep", prep)
    if err != nil {
        return "some error", err
    }
    return prep, nil
}

func x() {
   //...
    q, err := prepareQuery(cPool)
    if err != nil {
        return fmt.Errorf("failed to prepare query %s: %w", q, err)
    }

    rows, err := cPool.Query("queryPrep", "DumyStr", "'prop1','prop2'", myUUID) //myUUID is a valid satori uuid
    if err != nil {
        //return error...
    }

    for rows.Next() {   // zero rows
        //Scan...
    }
   //...
}

情景 2

func makeQueryStr()string {
    return fmt.Sprintf(`SELECT DISTINCT
        A,B,C
        FROM table t
        WHERE t.str1 = $1
        AND t.properties IN ($2)
        AND t.my_uuid = $3`)
}

func x() {
   //...
    myQuery := makeQueryStr()
    rows, err := cPool.Query(myQuery, "DumyStr", "'prop1','prop2'", myUUID) //myUUID is a valid satori uuid
    if err != nil {
        //return error...
    }

    for rows.Next() {   // zero rows
        //Scan...
    }
   //...
}

情景 3

func makeQueryStr(par1 string, par2 string, par3 uuid.UUID)string {
    return fmt.Sprintf(`SELECT DISTINCT
        A,B,C
        FROM table t
        WHERE t.str1 = '%s'
        AND t.properties IN (%s)
        AND t.my_uuid = '%s'`, par1, par2, par3)
}

func x() {
   //...
    myQuery := makeQueryStr("DumyStr", "'prop1','prop2'", myUUID) //myUUID is a valid satori uuid
    rows, err := cPool.Query(myQuery)
    if err != nil {
        //return error...
    }

    for rows.Next() {   // 10 rows
        //Scan...
    }
   //...
}

标签: postgresqlgopgx

解决方案


推荐阅读