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)
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)
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) }
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!