【问题标题】:"Operator does not exist: integer =?" when using Postgres“运算符不存在:整数=?”使用 Postgres 时
【发布时间】:2023-03-15 15:34:02
【问题描述】:

我在 go 的 database/sql 包提供的 QueryRow 方法中调用了一个简单的 SQL 查询。

import (
  "github.com/codegangsta/martini"
  "github.com/martini-contrib/render"
  "net/http"
  "database/sql"
  "fmt"
  _ "github.com/lib/pq")
)

type User struct {
  Name string
}

func Show(db *sql.DB, params martini.Params) {
  id := params["id"]
  row := db.QueryRow(
    "SELECT name FROM users WHERE id=?", id)
  u := User{}
  err := row.Scan(&u.Name)
  fmt.Println(err)
}

但是,我收到错误 pq: operator does not exist: integer =? 看起来代码不明白 ? 只是一个占位符。我该如何解决这个问题?

【问题讨论】:

  • 您收到该特定错误的原因是 =? 将是一个有效的 PostgreSQL 运算符名称。使用id = ?。但正如 mu 所说,Go 也可能不使用 ? 作为占位符。

标签: sql postgresql go pq


【解决方案1】:

PostgreSQL 原生使用编号占位符($1$2、...)而不是通常的位置问号。 documentation for the Go interface 在其示例中也使用了编号占位符:

rows, err := db.Query("SELECT name FROM users WHERE age = $1", age)

似乎 Go 接口没有像许多接口那样将问号转换为带编号的占位符,所以问号一直到达数据库并混淆了一切。

您应该能够切换到编号占位符而不是问号:

 row := db.QueryRow(
    "SELECT name FROM users WHERE id = $1", id)

【讨论】:

猜你喜欢
  • 2021-10-03
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2018-08-03
  • 2014-04-05
  • 2016-02-28
相关资源
最近更新 更多