通过 shell 但不是在 Go 中返回的 SQLite 行
SQLite row returned via shell but not in Go
我有一个 SQLite 查询,returns 预期结果在 shell 中。但是,当我 运行 在我的 Go 程序中执行相同的查询时,没有扫描任何值。
这是我的查询:
sqlite> select html, text from messages where id="17128ab240e7526e";
|Hey there
在这种情况下,html
是 NULL
并且 text
具有字符串 "Hey there"
。 table 有其他列和索引。
这是我的等效 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。
什么可以解释这种行为?
根据评论,我使用 COALESCE
修改了程序并且工作正常。
关键点是:不能scan
NULL
直接输入字符串,可以通过在查询中使用Coalesce
函数来克服这个问题。
row, err := conn.Query("select coalesce(html,'is-null'),text from messages where id =?", "17128ab240e7526e")
defer row.Close()
输出:
arun@debian:Whosebug$ go run main.go
2020/07/06 10:08:08 Has row: true
HTML: is-null
TEXT: Hey there
我有一个 SQLite 查询,returns 预期结果在 shell 中。但是,当我 运行 在我的 Go 程序中执行相同的查询时,没有扫描任何值。
这是我的查询:
sqlite> select html, text from messages where id="17128ab240e7526e";
|Hey there
在这种情况下,html
是 NULL
并且 text
具有字符串 "Hey there"
。 table 有其他列和索引。
这是我的等效 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。
什么可以解释这种行为?
根据评论,我使用 COALESCE
修改了程序并且工作正常。
关键点是:不能scan
NULL
直接输入字符串,可以通过在查询中使用Coalesce
函数来克服这个问题。
row, err := conn.Query("select coalesce(html,'is-null'),text from messages where id =?", "17128ab240e7526e")
defer row.Close()
输出:
arun@debian:Whosebug$ go run main.go
2020/07/06 10:08:08 Has row: true
HTML: is-null
TEXT: Hey there