Heim >Backend-Entwicklung >Golang >Zeilendaten aus der MySQL/Go-Tabelle abrufen
In diesem Artikel stellt Ihnen der PHP-Editor Xiaoxin vor, wie Sie Zeilendaten aus einer MySQL/Go-Tabelle abrufen. MySQL ist ein beliebtes relationales Datenbankverwaltungssystem und Go ist eine leistungsstarke Entwicklungssprache. Während des Entwicklungsprozesses müssen wir häufig Daten aus der Datenbank abrufen und verarbeiten. In diesem Artikel wird ausführlich beschrieben, wie Sie mithilfe der Go-Sprache eine Verbindung zur MySQL-Datenbank herstellen und über Abfrageanweisungen Zeilendaten aus der Tabelle abrufen. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, bietet Ihnen dieser Artikel hilfreiche Anleitungen und Beispielcode. Lasst uns beginnen!
Zuerst liest es den Code, damit Sie seine Logik verstehen. Wenn ich die gespeicherte Prozedur ausführe, die ich erfasst habe, erhalte ich eine Tabelle mit den Daten, die ich zurückgeben muss, die Namen der Spalten bringen es mir aber Die Daten der Spalten bringen mir nichts und ich kann das Modell nicht erstellen und die Antwort der gespeicherten Prozedur hat n Spalten mit n unterschiedlichen Namen, aber die Spalten unterscheiden sich dadurch, dass sie int-Daten und String-Daten haben. Ich brauche Sie, um die zu erfassen Korrigieren Sie die Daten aus der Spalte, da alles gut funktioniert, aber die Daten in der Spalte nicht funktionieren:
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)) }
Das ist, was es mir zurückgibt, es heißt „Spalten“: [„idPunto“, „nombre“] Der Teil ist in Ordnung, aber die Zeile mit den Daten entspricht nicht meinen Erwartungen:
Scannen Sie die Zeile. Wird ausgeführt into interface {} konvertiert SQL-Typen nicht automatisch in Go-Typen. Stattdessen wird mithilfe der ColumnTypes-Methode der Datentyp jeder Spalte abgerufen, sodass Sie dynamisch den richtigen Go-Typ zuweisen können. (Der folgende Inhalt wurde nicht getestet und dient nur als Referenz.) Zum Beispiel
for i := range columns { // Use the column types to determine the appropriate scan type switch columnTypes[i].DatabaseTypeName() { case "INT", "TINYINT", "SMALLINT", "MEDIUMINT", "BIGINT": scanArgs[i] = new(int64) default: scanArgs[i] = new(string) } values[i] = scanArgs[i] }
In deinem Drehbuch:
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 := []map[string]interface{}{} // Almacena los datos de filas // Get the column types columnTypes, err := rows.ColumnTypes() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } for rows.Next() { values := make([]interface{}, len(columns) scanArgs := make([]interface{}, len(columns)) for i := range columns { // Use the column types to determine the appropriate scan type switch columnTypes[i].DatabaseTypeName() { case "INT", "TINYINT", "SMALLINT", "MEDIUMINT", "BIGINT": scanArgs[i] = new(int64) default: scanArgs[i] = new(string) } values[i] = scanArgs[i] } 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 { // Cast the scanned values to the appropriate data types switch columnTypes[i].DatabaseTypeName() { case "INT", "TINYINT", "SMALLINT", "MEDIUMINT", "BIGINT": row[col] = *(scanArgs[i].(*int64)) default: row[col] = *(scanArgs[i].(*string)) } } fmt.Printf("Fila escaneada: %v\n", row) // Punto de impresión // Agrega esta fila al resultado data = append(data, row) } 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)) }
Hinweis: Sie sollten in der Lage sein, diese Logik auf andere Datentypen zu erweitern, auf die Sie möglicherweise stoßen.
Das obige ist der detaillierte Inhalt vonZeilendaten aus der MySQL/Go-Tabelle abrufen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!