SQLite行通过shell返回,但不在Go中
我有一个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> 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()返回错误的事实,所以我没有考虑检查它。事实上,错误信息非常清楚。