Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Scan() erro em campos NULL

Segue aqui uma pequena contribuição para quem se deparar com um erro como:

error converting NULL to string is unsupported

*Obs1: neste momento, não sei se é uma questão que será abordada mais à frente no curso.

*Obs2: não é um erro que necessariamente vai aparecer para quem está seguindo à risca o projeto deste curso.

Seguindo o exemplo da Aula 2 >Atividade 3, vamos supor que é uma loja que vende artigos usados e para cada produto há um campo, nullable (ou seja, permite o valor NULL), chamado observacao.

Pode ser então que um produto tenha ou não uma observação e quando você tenta fazer o SELECT com o método Scan(), verá o erro acima.

Nessa caso, ao declarar as variáveis que armazenarão o valor de cada campo da sua tabela, você deve tipá-las com os tipos do pacote de banco de dados que está usando. No meu caso e no deste curso, o database/sql.

Exemplo:

p := Produtos{}
produtos := []Produtos{}

for selectDeTodosOsProdutos.Next() {
    var id, quantidade sql.NullInt32
    var nome, descricao sql.NullString
    var preco sql.NullFloat64

    err = selectDeTodosOsProdutos.Scan(&id, &nome, &descricao, &preco, &quantidade)

    if err != nil {
        panic(err.Error())
    }

    p.Nome = nome.String
    p.Descricao = descricao.String
    p.Preco = float32(preco.Float64)
    p.Quantidade = int(quantidade.Int32)

    produtos = append(produtos, p)
}

O que aconteceu no exemplo acima foi que ao declarar as variáveis, nós tipamos com os tipos do pacote sql, permitindo os valores NULL e ao atribuí-las à interface/type Produtos{} (instanciada por p), convertemos para a tipagem do Go.

No final os valores NULL do banco de dados serão compilados para o Go com os valores inicializados/zerados de cada tipo. Ex: tipo string -> strings vazias, tipos numéricos -> zeros, tipo bool -> false. Para entender melhor, ver minuto 3:30 desta outra atividade.

Referência:

https://devtidbits.com/2020/08/03/go-sql-error-converting-null-to-string-is-unsupported/

1 resposta
solução!

Tópico pode ser fechado caso algum instrutor confirme que não falei nada de errado. Obrigado.