首先,它读取代码,以便您理解它所做的逻辑,当运行存储过程时,我捕获它的帖子,它给我带来了一个表,其中包含我必须返回的数据,列的名称确实给我带来了它,但列的数据没有给我带来任何东西,我无法创建模型,存储过程的响应有n个列,n个不同的名称,但是列在有int数据和字符串数据方面有所不同,我需要你从列中捕获正确的数据,因为一切都正常,但列中的数据不正常:
package controllers
import (
"database/sql"
"encoding/json"
"fmt"
"net/http"
"github.com/gin-gonic/gin"
)
type RequestData struct {
FromData map[string]interface{} `json:"fromData"`
Call string `json:"Call"`
}
func HandleDatos(c *gin.Context) {
var requestData RequestData
if err := c.ShouldBindJSON(&requestData); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
fmt.Printf("Ejecutando procedimiento almacenado: CALL %s\n", requestData.Call)
fmt.Printf("Parámetros: %v\n", requestData.FromData)
var rows *sql.Rows
var err error
// Verifica si FromData contiene valores
if len(requestData.FromData) > 0 {
// Si hay valores en FromData, crea una consulta con parámetros
query := "CALL " + requestData.Call + "("
params := []interface{}{}
for _, value := range requestData.FromData {
query += "?, "
params = append(params, value)
}
query = query[:len(query)-2] + ")"
rows, err = db.Raw(query, params...).Rows()
} else {
// Si no hay valores en FromData, ejecuta el procedimiento almacenado sin parámetros
rows, err = db.Raw("CALL " + requestData.Call).Rows()
}
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
defer rows.Close()
// Convierte los resultados en un mapa
result := make(map[string]interface{})
columns, err := rows.Columns()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
fmt.Printf("Columnas: %v\n", columns) // Punto de impresión
data := [][]interface{}{} // Almacena los datos de filas
for rows.Next() {
values := make([]interface{}, len(columns))
for i := range columns {
values[i] = new(interface{})
}
if err := rows.Scan(values...); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
fmt.Printf("Valores escaneados: %v\n", values) // Punto de impresión
row := make(map[string]interface{})
for i, col := range columns {
val := *(values[i].(*interface{}))
row[col] = val
}
fmt.Printf("Fila escaneada: %v\n", row) // Punto de impresión
// Agrega esta fila al resultado
data = append(data, values)
}
fmt.Printf("Datos finales: %v\n", data) // Punto de impresión
if len(data) > 0 {
result["columns"] = columns
result["data"] = data
} else {
// Si no hay datos, establece un mensaje personalizado
result["message"] = "Sin datos"
}
// Convierte el resultado en JSON y devuelve la respuesta
responseJSON, err := json.Marshal(result)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, string(responseJSON))
}
字符串
这就是它返回给我的内容,它说“columns”:[“idPunto”,“nombre”]这部分是好的,但包含数据的行不是我所期望的:
的数据
1条答案
按热度按时间2w3kk1z51#
将行扫描到接口{}中不会自动将SQL类型转换为Go类型。相反,使用ColumnTypes方法将获得每列的数据类型,从而允许您动态分配正确的Go类型。(以下内容未经测试,仅供参考。)例如
字符串
在您的脚本中:
型
nb:您应该能够扩展此逻辑,以用于可能遇到的其他数据类型。