当前位置: 首页 > 面试题库 >

恐慌:sql:扫描中应有1个目标参数,而不是 golang,pq,sql

端木皓君
2023-03-14
问题内容

我正在使用db.QueryRow获取数据。使用Postgresql创建的数据类型为jsonb的表。下面是golang中的代码

m := Message{}
err := db.QueryRow("SELECT data FROM message WHERE data->>'id'=$1", id).Scan(m.Id, m.Type, m.Title)

panic:sql:在Scan中应该有1个目标参数,而不是3。按行。Scan可以传递n个目标参数。此代码有什么问题?


问题答案:

查询每行返回一个字段。该代码正在扫描三个。也许您想要这样的东西:

err := db.QueryRow("SELECT data->>'id', data->>'type', data->>'title' FROM message WHERE data->>'id'=$1", id).Scan(m.Id, m.Type, m.Title)

另外,将指针传递给值:

err := db.QueryRow("SELECT data->>'id', data->>'type', data->>'title' FROM message WHERE data->>'id'=$1", id).Scan(&m.Id, &m.Type, &m.Title)

另一个选择是将数据作为单个字段获取,并使用encoding / json包对结果进行解码。

var p []byte
err := db.QueryRow("SELECT data FROM message WHERE data->>'id'=$1", id).Scan(&p)
if err != nil {
    // handle error
}
var m Message
err := json.Unmarshal(p, &m)
if err != nil {
    // handle error
}


 类似资料:
  • 问题内容: 我的第一个代码是 我的第二个代码是 使用这两个代码,我得到如下相同的错误 可能是因为我使用的是SQL Server,而不是MySQL?感谢是否有人可以帮助我找到问题。 问题答案: 当您要使用输入切片进行行扫描时,请使用可变的3点表示法将切片转换为单独的参数,如下所示: 使用可变参数的您的列(在本例中为三列)将有效地扩展为: 编辑 : SQL Scan方法的参数值必须为类型。因此,我们需

  • 在Golang中,没有恢复的panic将使进程崩溃,因此我最后将以下代码片段放在每个函数的开头: 只是为了防止我的程序崩溃。现在我在想,真的是要走的路吗?因为我觉得到处放同样的代码看起来有点奇怪。 在我看来,这是Java的方式,将异常冒泡到调用函数,直到main函数成为控制异常/恐慌的更好方式。我明白这是Go的设计,但像Go一样立即崩溃进程的好处是什么?

  • 问题内容: 我有以下连接到Mongo的功能。为了进行测试,我关闭了mongod,并希望允许该程序在w / 0 mongo不可用的情况下继续运行。如果无法连接服务器,MGO似乎会引发紧急情况,因此我在下面编写了一个延迟/恢复操作,但是紧急情况仍然导致程序退出。从中恢复的正确方法是什么? 问题答案: 运行您发布的代码的以下版本。尽量不要修改代码,至少不要更改行号的位置。这样,如果您发布堆栈跟踪,则数字

  • 问题内容: 在defer函数中,我想查看一次恢复调用是否会产生非nil值(不恢复) 可能吗? 问题答案: 那确切的事情是不可能的。您可能只想重新恐慌,就像在其他语言中重新引发异常一样。

  • 问题内容: 我有这个辅助函数,可以正常编译: 我这样称呼它: 问题是我收到此错误,但我无法弄清原因: +0x187 huru/routes/share.Handler.makeGetMany(0xc4200ae1e0, 0x10) /home/oleg/codes/huru/api/src/huru/routes/share/share.go:62 +0x108 它确实确认适配器片的长度为2: 有

  • 问题内容: 调用反射值的.FieldByName方法时出现以下错误,确切的错误是:- 和代码是:- 我了解的并不多,但这就是我所能获得的所有信息。 这是Go Playground上代码的链接:http : //play.golang.org/p/E038cPOoGp 问题答案: 您已经是一个指向结构的指针。尝试打印出您的代码。 没有理由使用的地址,然后调用that ,它会取消对刚创建的指针的引用。