Introduction
Dans le domaine de 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 alors que Go semble automatise 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() peuvent être utilisés de manière interchangeable pour exécuter des instructions SQL, ils diffèrent par le type de résultat qu'ils 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 = $1`, time.Now()) if err != nil { panic(err) } numDeleted, err := res.RowsAffected() if err != nil { panic(err) } print(numDeleted)
Alternativement, l'approche la plus lourde impliquerait d'utiliser DB.Query() et de parcourir les lignes pour les compter :
rows, err := db.Query(`DELETE FROM my_table WHERE expires_at = $1 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)
De plus, lorsque le résultat d'une requête n'est pas pertinent et qu'il vous suffit de l'exécuter, DB.exec() propose une solution concise :
if _, err := db.Exec(``); err != nil { panic(err) }
En revanche, laisser de côté l'appel de clôture pour la valeur DB.Rows lors de l'utilisation de DB.Query() finira par entraîner une surcharge de connexions ouvertes en raison de fuites de mémoire.
Plonger dans les instructions préparées
Bien qu'il ait été suggéré que Go crée automatiquement des instructions préparées déclarations, la réalité semble plus nuancée. Le comportement de DB.Query() semble dépendre du pilote sous-jacent utilisé.
Néanmoins, la préparation et la réutilisation de DB.Stmt peuvent 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.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3