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

我有一个 SQLite 查询,它在 shell 中返回预期的结果。但是,当我在 Go 程序中运行相同的查询时,不会扫描任何值。


这是我的查询:


sqlite> select html, text from messages where id="17128ab240e7526e";

|Hey there

在这种情况下,htmlisNULL并且text具有字符串"Hey there"。该表具有其他列和索引。


这是我等效的 Go 代码:


package main


import (

    "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.go

2020/07/05 21:10:14 Has row: true

2020/07/05 21:10:14 HTML: 

2020/07/05 21:10:14 TEXT: 

有趣的是,这只发生在该列为html空时。如果html不为空,则无论text该列的值是否为空,都按预期返回数据。


什么可以解释这种行为?


米琪卡哇伊
浏览 108回答 1
1回答

慕的地10843

根据评论,我修改了使用的程序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.go2020/07/06 10:08:08 Has row: trueHTML: is-nullTEXT: Hey there
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go