Maison >développement back-end >Golang >Comment lire les colonnes « SELECT * » dans une chaîne [] dans Go avec un schéma de table inconnu ?

Comment lire les colonnes « SELECT * » dans une chaîne [] dans Go avec un schéma de table inconnu ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-11 12:01:021025parcourir

How to Read

Comment lire les colonnes « SELECT * » dans une []chaîne en Go

En Go, la récupération des lignes d'une base de données peut être réalisée à l'aide de SQL package, tout en manipulant ces lignes et en les écrivant dans des fichiers tels que CSV peuvent être effectués à l'aide du package csv. Cependant, un problème survient lorsque le schéma de la table est inconnu et doit être déterminé dynamiquement.

Le problème : schéma de table inconnu

La méthode Scan dans le type Rows s'attend à ce que les champs soient de types spécifiques basés sur le schéma de la table. Sans connaissance préalable de ce schéma, il est difficile de déterminer combien de colonnes existent et quels sont leurs types. Cela pose un défi lorsque l'on essaie de lire les colonnes dans un type générique tel que []string.

Solution : utiliser un type d'interface

Pour surmonter ce problème, une tranche []interface{} peut être utilisé pour pointer vers chaque chaîne dans la tranche de chaîne []string. Ceci est nécessaire car Scan attend un tableau de pointeurs vers les variables de destination. L'extrait de code suivant illustre cette approche :

package main

import (
    "database/sql"
    "fmt"
    "log"
)

func main() {
    // Establish a connection to the database.
    db, err := sql.Open("mysql", "user:pass@tcp(localhost:3306)/test")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // Execute the "SELECT *" query.
    rows, err := db.Query("SELECT * FROM my_table")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    // Get the column names.
    cols, err := rows.Columns()
    if err != nil {
        log.Fatal(err)
    }

    // Create an interface{} slice pointing to each string in the []string slice.
    var readCols = make([]interface{}, len(cols))
    var writeCols = make([]string, len(cols))
    for i, _ := range writeCols {
        readCols[i] = &writeCols[i]
    }

    // Iterate over the rows and scan the columns into the string slice.
    for rows.Next() {
        if err := rows.Scan(readCols...); err != nil {
            log.Fatal(err)
        }
        fmt.Println(writeCols)
    }
}

Dans cet exemple, la tranche readCols contient des pointeurs vers chaque élément de la tranche writeCols. Lorsque Scan est appelé, les valeurs de la ligne sont affectées aux variables pointées par readCols, qui sont ensuite copiées dans la tranche writeCols. Cela permet la lecture dynamique des colonnes de la base de données dans une tranche de chaîne.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn