Estou desenvolvendo com Couchbase e o Go SDK há algum tempo, mas recentemente me deparei com um problema que considerei ser um bug no SDK após horas de solução de problemas. Eu estava tentando executar uma consulta N1QL que, de fato, tinha resultados. O problema era que eu não estava vendo nenhum desses resultados no aplicativo Go.
Depois de resolver o problema com o engenheiro do Go SDK, não se tratava de um bug, mas, na verdade, de alguns erros do usuário. Que constrangedor, não é?
Veremos o que eu estava fazendo de errado e as etapas que foram usadas para corrigir o problema.
No meu aplicativo Go, eu tinha várias estruturas de dados que deveriam ser modeladas de acordo com os dados que eu estava armazenando no Couchbase. Uma dessas estruturas de dados era parecida com a seguinte:
1 2 3 4 5 6 7 |
tipo Blog estrutura { Tipo string `json:"type,omitempty"` Pid string `json:"pid,omitempty"` Título string `json:"title,omitempty"` Conteúdo string `json:"content,omitempty"` Carimbo de data/hora int `json:"timestamp,omitempty"` } |
Acima está uma estrutura de dados muito simples que representa um modelo de documento muito simples.
Para consultar todos os Blog
documentos no meu Bucket do Couchbase, eu estava executando o seguinte código:
1 2 3 4 5 6 7 8 9 10 11 12 |
consulta := gocb.NewN1qlQuery("SELECT `" + balde.Nome() + "`.* FROM `" + balde.Nome() + "` WHERE type = 'blog'") linhas, erro := balde.ExecutarN1qlQuery(consulta, nulo) se erro != nulo { fmt.Println(erro.Erro()) retorno } var fila Blog para linhas.Próximo(&fila) { fmt.Println(fila) fila = Blog{} } linhas.Fechar() |
Ao executar meu aplicativo, nenhum resultado foi impresso, embora eu pudesse validar em outro lugar que minha consulta estava correta. O Próxima
estava sempre retornando falso.
A próxima etapa lógica foi garantir que o Couchbase estivesse recebendo a solicitação corretamente do aplicativo com Go SDK. Isso foi verificado por meio do monitoramento dos logs do Couchbase. Os logs indicaram que tudo estava certo.
Em seguida, alterei um pouco meu código:
1 2 3 4 5 6 7 8 9 |
consulta := gocb.NewN1qlQuery("SELECT `" + balde.Nome() + "`.* FROM `" + balde.Nome() + "` WHERE type = 'blog'") linhas, erro := balde.ExecutarN1qlQuery(consulta, nulo) se erro != nulo { fmt.Println(erro.Erro()) retorno } var fila Blog linhas.Um(&fila) fmt.Println(fila) |
Em vez de usar o Próxima
usei a função Um
função. Um dos resultados foi a impressão, mas não percebi que era uma impressão parcial.
Depois de falar com Brett Lawson, o engenheiro do Go SDK, ele concluiu que eu estava recebendo erros que estavam causando falhas nos resultados.
Mas espere um pouco. O seguinte não imprime meus erros?
1 2 3 4 |
se erro != nulo { fmt.Println(erro.Erro()) retorno } |
O código acima imprimia erros na execução da consulta. Na verdade, eu estava tendo erros em outro lugar, depois que a consulta tinha sido executada e eu tinha recebido os resultados.
Brett recomendou que eu alterasse meu código para o seguinte:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
consulta := gocb.NewN1qlQuery("SELECT `" + balde.Nome() + "`.* FROM `" + balde.Nome() + "` WHERE type = 'blog'") linhas, erro := balde.ExecutarN1qlQuery(consulta, nulo) se erro != nulo { fmt.Println(erro.Erro()) retorno } var fila Blog para linhas.Próximo(&fila) { fmt.Println(fila) fila = Blog{} } erro = linhas.Fechar() fmt.Println(erro) |
Observe que estou imprimindo o erro no campo Fechar
função desta vez.
Acontece que havia erros. O problema era que meus resultados não estavam sendo mapeados corretamente para minha estrutura de dados. Mais especificamente, eu estava tendo um problema com a variável Carimbo de data/hora
propriedade.
Eu estava salvando o Carimbo de data/hora
como int64
dados, mas eu estava tentando lê-los como se fossem int
. Esse pequeno detalhe estava causando um erro que eu não estava detectando, levando-me a acreditar que meus resultados estavam vazios e que havia um bug no Go SDK.
Conclusão
A moral da história aqui é que, se uma função em Go retornar um erro, definitivamente aproveite a informação e faça algo com ela. Não omita o erro de seu código e proceda como se ele não existisse. Isso pode lhe custar horas de frustração no futuro.
Para ver meu tíquete de problema embaraçoso e a resolução adequada, confira o rastreador do Jira aqui.
Para obter mais informações sobre como usar o Go SDK com o Couchbase, consulte a seção Portal do desenvolvedor do Couchbase.