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/