He estado desarrollando con Couchbase y el Go SDK desde hace un tiempo, pero recientemente me encontré con un problema que consideré un error en el SDK después de horas de solución de problemas. Estaba tratando de ejecutar una consulta N1QL que sabía a ciencia cierta que tenía resultados. El problema era que no veía ninguno de esos resultados dentro de la aplicación Go.
Después de aclarar las cosas con el ingeniero del SDK de Go, no se trataba de un bug, sino de errores del usuario. Qué vergüenza, ¿verdad?
Vamos a ver lo que estaba haciendo mal y los pasos que se utilizaron para corregir el problema.
En mi aplicación Go tenía varias estructuras de datos que debían modelarse a partir de los datos que almacenaba en Couchbase. Una de esas estructuras de datos tenía el siguiente aspecto:
1 2 3 4 5 6 7 |
tipo Blog struct { Tipo cadena `json:"tipo,omitempty"` Pid cadena `json:"pid,omitempty"` Título cadena `json:"título,omitempty"` Contenido cadena `json:"contenido,omitempty"` Marca de tiempo int `json:"timestamp,omitempty"` } |
La anterior es una estructura de datos muy simple que representa un modelo de documento muy sencillo.
Para consultar todos Blog
en mi Couchbase Bucket, estaba ejecutando el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 |
consulta := gocb.NuevoN1qlQuery("SELECT `" + cubo.Nombre() + "`.* FROM `" + cubo.Nombre() + "WHERE type = 'blog'") filas, err := cubo.EjecutarN1qlQuery(consulta, nil) si err != nil { fmt.Imprimir(err.Error()) devolver } var fila Blog para filas.Siguiente(&fila) { fmt.Imprimir(fila) fila = Blog{} } filas.Cerrar() |
Al ejecutar mi aplicación, no se imprimía ningún resultado aunque pude validar en otra parte que mi consulta era correcta. La dirección Siguiente
siempre devolvía false.
El siguiente paso lógico era asegurarse de que Couchbase estaba recibiendo la petición correctamente desde la aplicación Go SDK. Esto se verificó a través de la monitorización de los logs de Couchbase. Los registros habían indicado que todo cuadraba.
Entonces cambié un poco mi código:
1 2 3 4 5 6 7 8 9 |
consulta := gocb.NuevoN1qlQuery("SELECT `" + cubo.Nombre() + "`.* FROM `" + cubo.Nombre() + "WHERE type = 'blog'") filas, err := cubo.EjecutarN1qlQuery(consulta, nil) si err != nil { fmt.Imprimir(err.Error()) devolver } var fila Blog filas.Un(&fila) fmt.Imprimir(fila) |
En lugar de utilizar el Siguiente
utilicé la función .uno
función. Uno de los resultados fue la impresión, sin embargo, no me di cuenta de que era una impresión parcial.
Tras hablar con Brett Lawson, el ingeniero del SDK de Go, llegó a la conclusión de que estaba recibiendo errores que hacían que los resultados fallaran.
Pero espera un segundo. ¿No imprime lo siguiente mis errores?:
1 2 3 4 |
si err != nil { fmt.Imprimir(err.Error()) devolver } |
El código anterior imprimía errores con la ejecución de la consulta. En realidad tenía errores en otra parte, después de que la consulta se hubiera ejecutado y hubiera recibido resultados.
Brett me recomendó que cambiara mi código por el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
consulta := gocb.NuevoN1qlQuery("SELECT `" + cubo.Nombre() + "`.* FROM `" + cubo.Nombre() + "WHERE type = 'blog'") filas, err := cubo.EjecutarN1qlQuery(consulta, nil) si err != nil { fmt.Imprimir(err.Error()) devolver } var fila Blog para filas.Siguiente(&fila) { fmt.Imprimir(fila) fila = Blog{} } err = filas.Cerrar() fmt.Imprimir(err) |
Observe que estoy imprimiendo el error en el Cerrar
función esta vez.
Resulta que había errores. El problema era que mis resultados no se asignaban correctamente a mi estructura de datos. Más específicamente, yo estaba teniendo un problema con el Marca de tiempo
propiedad.
Estaba guardando el Marca de tiempo
como int64
datos, pero intentaba leerlo como si fuera int
. Este pequeño detalle estaba causando un error que yo no detectaba, lo que me llevó a pensar que mis resultados estaban vacíos y que había un error en el SDK de Go.
Conclusión
La moraleja de esta historia es que si una función Go devuelve un error, definitivamente aprovecha la información y haz algo con ella. No omitas el error de tu código y procedas como si no existiera. Podría costarte horas de frustración en el futuro.
Para ver mi bochornoso ticket de incidencia y la resolución adecuada, echa un vistazo al rastreador de Jira aquí.
Para obtener más información sobre el uso del SDK Go con Couchbase, consulte la página Portal para desarrolladores de Couchbase.