Строка 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
Другие вопросы по тегам