【问题标题】:Go postgresql LIKE query去 postgresql LIKE 查询
【发布时间】:2014-10-02 13:55:49
【问题描述】:

我正在使用 Go 和 PostgreSQL(pq 驱动程序),我有以下查询

SELECT p.id, p.name, p.description, p.price, p.image, p.rate
FROM products AS p
WHERE LOWER(p.name) LIKE %$1% ORDER BY p.rate DESC

如果我直接在 PostgreSQL 中执行这个查询,它可以工作,但在 Golang 中说:

pq: syntax error at or near "%"

我该如何解决?我尝试使用“\%”,但没有奏效。 谢谢。

这里是完整的源代码

func FindByName(name *string) ([]*Product, error) {
    db, err := db.StablishConnection()
    if err != nil {
            log.Fatal(err)
            panic(err)
    }
    defer db.Close()

    query := `SELECT p.id, p.name, p.description, p.price, p.image, p.rate
        FROM products AS p
        WHERE LOWER(p.name) LIKE %$1% ORDER BY p.rate DESC`

    product_rows, err := db.Query(query, name)

    if err != nil {
            return nil, err
    }

    if product_rows == nil {
            return nil, errors.New("No Products Named " + *name)
    }

    products := []*Product{}
    for product_rows.Next() {
            product := new(Product)
            err = product_rows.Scan(&product.Id,
                    &product.Name,
                    &product.Description,
                    &product.Price,
                    &product.Image,
                    &product.Rate)
            if err != nil {
                    panic(err)
            }
            products = append(products, product)
    }
    return products, nil
}

【问题讨论】:

    标签: sql postgresql go


    【解决方案1】:

    您需要将like 模式放在单引号中:

    SELECT p.id, p.name, p.description, p.price, p.image, p.rate
    FROM products AS p
    WHERE LOWER(p.name) LIKE '%' || $1 || '%'
    ORDER BY p.rate DESC;
    

    【讨论】:

    • 现在它说:pq: got 1 parameters but the statement requires 0 as if it doesn't identify the $1
    • 您不需要LIKE '%' || $1 || '%' 才能将占位符识别为占位符吗?或者在 Go 中进行字符串连接并使用 LIKE $1.
    • LIKE '%' || $1 || '%' 有效,'%?%' 说 pq: got 1 个参数,但语句需要 0
    • 可以确认:WHERE name LIKE %?% 不起作用。结果为near "%": syntax error。答案是:WHERE name LIKE '%'||?||'%'
    • @Gordon Linoff,我正在苦苦思索如何在 golang 中与 sqlite3 一起使用 LIKE 和 % 并遇到了这篇文章。拯救了我的一天。
    【解决方案2】:

    在准备查询时不要放 qoutes。只需提供带有 qoutes 和 % 符号的值。这将解决问题。久经考验。

    解决方案: 查询 := SELECT p.id, p.name, p.description, p.price, p.image, p.rate FROM products AS p WHERE LOWER(p.name) LIKE $1 ORDER BY p.rate DESC

    product_rows, err := db.Query(query, "'%" + name + "%'")
    

    我的解决方案来自this thread

    【讨论】:

    • 刚刚发现解决方案取决于 Golang 的版本,因为在将 golang 升级到 1.10 后,我的解决方案停止工作,我不得不选择 '%' || $1 || '%' 解决方案。因此,请尝试不同的解决方案以使事情正常进行
    • 这可能容易受到SQL injections的攻击。
    【解决方案3】:
    query := `SELECT p.id, p.name, p.description, p.price, p.image, p.rate
        FROM products AS p
        WHERE LOWER(p.name) LIKE $1 ORDER BY p.rate DESC`
    
    product_rows, err := db.Query(query, '%' + name+ '%'))
    

    【讨论】:

      【解决方案4】:

      我想这是最正确的做法:

      query := `SELECT p.id, p.name, p.description, p.price, p.image, p.rate
          FROM products AS p
          WHERE LOWER(p.name) LIKE CONCAT('%%',$1::text,'%%') ORDER BY p.rate DESC`
      
      product_rows, err := db.Query(query, name)
      
      if err != nil {
              return nil, err
      }
      

      【讨论】:

        【解决方案5】:

        这对我有用

        query := "SELECT ProductId,Name,Description,Price,SKU FROM Products WHERE Name LIKE ?"
        rows, err := r.db.QueryContext(ctx, query, "%"+name+"%")
        

        【讨论】:

          【解决方案6】:

          根据this issue,您的查询不能包含'%'符号,但“name”参数必须用'%'引用

          query := `SELECT p.id, p.name, p.description, p.price, p.image, p.rate
              FROM products AS p
              WHERE LOWER(p.name) LIKE $1 ORDER BY p.rate DESC`
          
          product_rows, err := db.Query(query, fmt.Sprintf("%%%s%%", name))
          

          【讨论】:

          • 不安全,sqlinjection可能发生在里面
          猜你喜欢
          • 2021-02-20
          • 2016-10-30
          • 2018-06-21
          • 1970-01-01
          • 2010-12-06
          • 1970-01-01
          • 2016-07-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多