While Sie können db.Exec und db.Query austauschbar für dieselben SQL-Anweisungen verwenden, sie liefern jedoch unterschiedliche Ergebnisse. db.Exec gibt die Anzahl der betroffenen Zeilen zurück (sofern vom Treiber unterstützt), während db.Query ein Zeilenobjekt zurückgibt.
Um beispielsweise die Anzahl der in einer DELETE-Anweisung gelöschten Zeilen zu zählen:
res, err := db.Exec(`DELETE FROM my_table WHERE expires_at = `, time.Now()) numDeleted, err := res.RowsAffected() // Returns the number of deleted rows
Alternativ (aber weniger effizient):
rows, err := db.Query(`DELETE FROM my_table WHERE expires_at = RETURNING *`, time.Now()) numDeleted := 0 for rows.Next() { numDeleted++ } // Iterate over deleted rows
db.Exec sollte auch verwendet werden, wenn Sie die Abfrage nicht benötigen Ergebnisse, nur eine Fehlerprüfung:
if _, err := db.Exec(`<my_sql_query>`); err != nil { panic(err) }
Die Behauptung der Dokumentation, dass Go unter der Decke immer vorbereitete Anweisungen verwendet, ist möglicherweise nicht korrekt. Die Treiberimplementierung scheint zu bestimmen, ob für jeden db.Query-Aufruf eine neue vorbereitete Anweisung erstellt wird.
Der manuelle Aufruf von db.Prepare und das Zwischenspeichern des resultierenden db.Stmt kann jedoch die Leistung für häufig ausgeführte Abfragen verbessern. Weitere Informationen finden Sie in der PostgreSQL-Dokumentation: https://www.postgresql.org/docs/current/static/sql-prepare.html
Das obige ist der detaillierte Inhalt vonWann und warum sollte ich „db.Exec()' und vorbereitete Anweisungen in Go verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!