Maison > développement back-end > Golang > Dois-je utiliser « DB.exec() » ou des instructions préparées dans Go pour les requêtes sans lignes de résultats ?

Dois-je utiliser « DB.exec() » ou des instructions préparées dans Go pour les requêtes sans lignes de résultats ?

Susan Sarandon
Libérer: 2024-12-12 22:42:30
original
383 Les gens l'ont consulté

Should I Use `DB.exec()` or Prepared Statements in Go for Queries Without Result Rows?

Décrypter l'énigme de l'utilisation de *DB.exec() et des instructions préparées dans Golang

Introduction

Dans le domaine de la manipulation de bases de données à l'aide de Go et Postgresql, la question persistante se pose : pourquoi s'embêter avec DB.exec() ou des instructions préparées lorsque Go automatise apparemment leur création ? Cet article explore les subtilités de l'exécution d'opérations qui ne renvoient pas de lignes et explique la raison d'être de l'utilisation d'instructions préparées.

Pourquoi utiliser DB.exec() ?

Bien qu'il soit vrai que DB.Query() et DB.exec() peut être utilisé de manière interchangeable pour exécuter des instructions SQL, elles diffèrent par le type de résultat qu'elles renvoient. DB.exec() fournit des informations sur le nombre de lignes affectées par la requête, tandis que DB.Query() renvoie un ensemble de résultats.

Par exemple, supposons vous souhaitez exécuter une instruction DELETE et vérifier le nombre de lignes supprimées. L'utilisation de DB.exec() est l'approche préférée :

res, err := db.Exec(`DELETE FROM my_table WHERE expires_at = `, time.Now())
if err != nil {
    panic(err)
}

numDeleted, err := res.RowsAffected()
if err != nil {
    panic(err)
}
print(numDeleted)
Copier après la connexion

Alternativement, l'approche la plus lourde impliquerait d'utiliser DB.Query() et de parcourir le lignes pour les compter :

rows, err := db.Query(`DELETE FROM my_table WHERE expires_at =  RETURNING *`, time.Now())
if err != nil {
    panic(err)
}
defer rows.Close()

var numDeleted int
for rows.Next() {
    numDeleted += 1
}
if err := rows.Err(); err != nil {
    panic(err)
}
print(numDeleted)
Copier après la connexion

De plus, lorsque le résultat d'une requête n'est pas pertinent et qu'il suffit de l'exécuter, DB.exec() propose une solution concise :

if _, err := db.Exec(`<my_sql_query>`); err != nil {
    panic(err)
}
Copier après la connexion

En revanche, laisser de côté l'appel rapproché pour la valeur DB.Rows renvoyée lors de l'utilisation de DB.Query() finira par entraîner une surcharge de connexions ouvertes en raison de la mémoire fuites.

Explorer les déclarations préparées

Bien qu'il ait été suggéré que Go crée automatiquement des déclarations préparées, la réalité semble être plus nuancée. Le comportement de DB.Query() semble dépendre du pilote sous-jacent utilisé.

Néanmoins, préparer et réutiliser DB.Stmt peut améliorer les performances des tâches fréquemment exécutées. requêtes. Un aperçu de la documentation officielle de Postgresql révèle comment les instructions préparées peuvent optimiser les opérations.

Conclusion

Comprendre les distinctions entre DB.exec() et Les instructions préparées dans Golang aident les développeurs à exécuter des opérations qui ne renvoient pas efficacement des lignes et à tirer parti des avantages des instructions préparées lors de la recherche d'optimisations de performances.

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