通过外壳返回的SQLite行,但不在Go中

时间:2020-07-06 01:15:43

标签: sqlite go go-sqlite3

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

这是我的查询:

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

在这种情况下,htmlNULL,而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 not null,则无论text列的值是否为null,都将按预期返回数据。

什么可以解释这种行为?

1 个答案:

答案 0 :(得分:1)

根据评论,我使用COALESCE修改了程序,并且运行正常。

关键点是:无法scan NULL直接成字符串,可以通过使用Query中的Coalesce函数来克服这一点。

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