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

SQLite行通过shell返回,但不在Go中,sqlite,go,go-sqlite3,Sqlite,Go,Go Sqlite3,我有一个SQLite查询,它在shell中返回预期的结果。但是,当我在Go程序中运行相同的查询时,不会扫描任何值 我的问题是: sqlite> select html, text from messages where id="17128ab240e7526e"; |Hey there 在本例中,html为NULL,text具有字符串“Hey there”。该表还有其他列和索引 以下是我的等效Go代码: package main import ( "

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

我的问题是:

sqlite> select html, text from messages where id="17128ab240e7526e";
|Hey there
在本例中,
html
NULL
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
不为null,则无论
text
列的值是否为null,都会按预期返回数据


什么可以解释这种行为?

根据我的评论,我使用
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

在搜索要安装的文档时,尝试在我的debian框中测试此问题,发现
sqlite
sqlite3
。我认为您使用的是
sqlite
。如果是这种情况,您可以尝试使用
sqlite3
?(对不起,如果我错了!!)你不能将
NULL
直接扫描到
string
,这将导致
scan
返回一个错误,如果你不忽略它,它会让你知道,并且可能会让你从一开始就不用写问题。您可以扫描到
*string
sql.NullString
来处理这种情况,或者,如果sqlite有
合并
,您可以在查询中使用它。无论您选择哪种方式来处理
NULL
,您都应该努力避免忽略错误。谢谢@mkopriva!似乎我忽略了Scan()返回错误的事实,所以我没有考虑检查它。事实上,错误信息非常清楚。