为了账号安全,请及时绑定邮箱和手机立即绑定

SQLite 行通过 shell 返回,但不在 Go 中

SQLite 行通过 shell 返回,但不在 Go 中

Go
米琪卡哇伊 2022-06-13 16:39:10
我有一个 SQLite 查询,它在 shell 中返回预期的结果。但是,当我在 Go 程序中运行相同的查询时,不会扫描任何值。这是我的查询:sqlite> select html, text from messages where id="17128ab240e7526e";|Hey there在这种情况下,htmlisNULL并且text具有字符串"Hey there"。该表具有其他列和索引。这是我等效的 Go 代码:package mainimport (    "database/sql"    "log"    _ "github.com/mattn/go-sqlite3")func main() {    filename := "emails.db"    conn, err := sql.Open("sqlite3", filename)    if err != nil {        log.Fatal(err)    }    row, err := conn.Query("select html, text from messages where id = ?", "17128ab240e7526e")    defer row.Close()    if err != nil {        log.Fatal(err)    }    hasRow := row.Next()    log.Println("Has row:", hasRow)    var html, text string    row.Scan(&html, &text)    log.Println("HTML:", html)    log.Println("TEXT:", text)}输出是:$ go run main.go2020/07/05 21:10:14 Has row: true2020/07/05 21:10:14 HTML: 2020/07/05 21:10:14 TEXT: 有趣的是,这只发生在该列为html空时。如果html不为空,则无论text该列的值是否为空,都按预期返回数据。什么可以解释这种行为?
查看完整描述

1 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

根据评论,我修改了使用的程序COALESCE并且工作正常。


关键是:不能scan NULL直接转成字符串,Coalesce可以通过Query中的函数来克服这个问题。


row, err := conn.Query("select coalesce(html,'is-null'),text from messages where id =?", "17128ab240e7526e")

defer row.Close()

输出:


arun@debian:stackoverflow$ go run main.go

2020/07/06 10:08:08 Has row: true

HTML: is-null

TEXT: Hey there


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信