Строка SQLite, возвращенная через оболочку, но не в Go
У меня есть запрос SQLite, который возвращает ожидаемые результаты в оболочке. Однако когда я запускаю тот же запрос в своей программе 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
столбец равен нулю.
Чем можно объяснить такое поведение?
1 ответ
Основываясь на комментариях, я модифицировал программу, используя COALESCE
и работает нормально.
Ключевой момент: не может scan
NULL
, непосредственно в строку, можно преодолеть это, используяCoalesce
функция в запросе.
row, err := conn.Query("select coalesce(html,'is-null'),text from messages where id =?", "17128ab240e7526e")
defer row.Close()
Выход:
arun@debian:stackru$ go run main.go
2020/07/06 10:08:08 Has row: true
HTML: is-null
TEXT: Hey there