Maison > développement back-end > Golang > Comment effectuer efficacement des mises à jour groupées dans PostgreSQL à l'aide de Go ?

Comment effectuer efficacement des mises à jour groupées dans PostgreSQL à l'aide de Go ?

Barbara Streisand
Libérer: 2024-12-05 07:19:11
original
884 Les gens l'ont consulté

How to Efficiently Perform Bulk Updates in PostgreSQL using Go?

Mise à jour groupée dans PostgreSQL avec Go Query Builder

Face à la nécessité de mettre à jour plusieurs lignes dans une base de données PostgreSQL, l'approche traditionnelle consiste à exécuter une instruction UPDATE distincte pour chaque rangée. Cependant, pour des raisons de performances, il est souvent souhaitable d'exécuter une seule instruction UPDATE pour mettre à jour plusieurs lignes en une seule fois.

Approche des tables dérivées

Une méthode efficace pour la mise à jour groupée dans PostgreSQL consiste à utiliser une table dérivée. Cette technique consiste à créer une table temporaire avec les mises à jour souhaitées, puis à utiliser les données de cette table pour mettre à jour la table cible.

Considérez le scénario suivant dans lequel nous visons à mettre à jour plusieurs lignes de la table « table » avec de nouvelles valeurs des colonnes "column_a" et "column_b":

import (
    "database/sql"
    _"github.com/jackc/pgx/v4/stdlib" // PostgreSQL driver
)

func main() {
    db, err := sql.Open("pgx", "host=localhost port=5432 dbname=test user=postgres password=mysecretpassword")
    if err != nil {
        panic(err)
    }
    defer db.Close()

    // Prepare the derived table with updated values
    query := `UPDATE t
SET column_a = v.column_a,
    column_b = v.column_b
FROM (VALUES (1, 'FINISH', 1234),
             (2, 'UNFINISH', 3124)
     ) v(id, column_a, column_b)
WHERE v.id = t.id;`
    _, err = db.Exec(query)
    if err != nil {
        panic(err)
    }

    // Optionally, you can verify the updated rows
    rows, err := db.Query("SELECT * FROM table WHERE id IN (1, 2)")
    if err != nil {
        panic(err)
    }
    defer rows.Close()

    for rows.Next() {
        var id int
        var columnA, columnB string
        if err := rows.Scan(&id, &columnA, &columnB); err != nil {
            panic(err)
        }
        fmt.Printf("ID: %d, Column A: %s, Column B: %s\n", id, columnA, columnB)
    }
}
Copier après la connexion

Cette approche offre une flexibilité dans l'ajout ou la suppression de lignes et de colonnes dans la table dérivée sans modifier la requête principale. Cela permet également d'éviter les erreurs accidentelles par rapport à la spécification explicite de plusieurs instructions UPDATE.

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