Maison > développement back-end > Golang > Comment puis-je insérer efficacement plusieurs lignes de données dans une base de données Go à l'aide d'instructions préparées ?

Comment puis-je insérer efficacement plusieurs lignes de données dans une base de données Go à l'aide d'instructions préparées ?

Mary-Kate Olsen
Libérer: 2024-12-23 01:36:26
original
786 Les gens l'ont consulté

How Can I Efficiently Insert Multiple Rows of Data into a Go Database Using Prepared Statements?

Insertion efficace de plusieurs données dans Go

L'insertion de plusieurs lignes de données dans une base de données en une seule opération peut améliorer considérablement l'efficacité. Dans Go, une façon courante d'y parvenir consiste à utiliser des instructions préparées. Bien que l'utilisation de la concaténation de chaînes comme démontré dans votre question puisse sembler pratique, elle est moins sécurisée et peut conduire à des vulnérabilités d'injection SQL.

Utilisation d'instructions préparées

Pour insérer plusieurs lignes à l'aide déclarations préparées, vous pouvez suivre ces étapes :

  1. Créer un modèle d'instruction SQL avec des espaces réservés pour les données valeurs :
INSERT INTO test(n1, n2, n3) VALUES (?, ?, ?)
Copier après la connexion
  1. Préparez l'instruction à l'aide de la méthode db.Prepare :
stmt, err := db.Prepare(sqlStr)
if err != nil {
    // Handle error
}
Copier après la connexion
  1. Construisez une tranche de valeurs pour chaque ligne :
vals := []interface{}{}

for _, dataRow := range data {
    vals = append(vals, dataRow["v1"], dataRow["v2"], dataRow["v3"])
}
Copier après la connexion
  1. Exécutez l'instruction avec le valeurs :
res, err := stmt.Exec(vals...)
if err != nil {
    // Handle error
}
Copier après la connexion

Cette approche garantit que l'instruction SQL n'est analysée qu'une seule fois et que les valeurs sont insérées en toute sécurité en tant que paramètres.

Exemple :

Voici un exemple d'insertion de plusieurs lignes dans une table « test » à l'aide d'instructions préparées :

import (
    "database/sql"
    "fmt"
)

type DataRow struct {
    v1 string
    v2 string
    v3 string
}

func main() {
    data := []DataRow{
        {v1: "1", v2: "1", v3: "1"},
        {v1: "2", v2: "2", v3: "2"},
        {v1: "3", v2: "3", v3: "3"},
    }

    db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database")
    if err != nil {
        // Handle error
    }

    sqlStr := "INSERT INTO test(n1, n2, n3) VALUES (?, ?, ?)"
    stmt, err := db.Prepare(sqlStr)
    if err != nil {
        // Handle error
    }

    vals := []interface{}{}
    for _, dataRow := range data {
        vals = append(vals, dataRow.v1, dataRow.v2, dataRow.v3)
    }

    res, err := stmt.Exec(vals...)
    if err != nil {
        // Handle error
    }

    affectedRows, err := res.RowsAffected()
    if err != nil {
        // Handle error
    }

    fmt.Printf("Inserted %d rows", affectedRows)
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal