„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Sollte ich „DB.exec()“ oder vorbereitete Anweisungen in Go für Abfragen ohne Ergebniszeilen verwenden?

Sollte ich „DB.exec()“ oder vorbereitete Anweisungen in Go für Abfragen ohne Ergebniszeilen verwenden?

Veröffentlicht am 23.12.2024
Durchsuche:367

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

Entschlüsselung des Rätsels bei der Verwendung von *DB.exec() und vorbereiteten Anweisungen in Golang

Einführung

Im Bereich Bei der Datenbankmanipulation mit Go und Postgresql stellt sich immer noch die Frage: Warum sollte man sich damit beschäftigen? DB.exec() oder vorbereitete Anweisungen, wenn Go ihre Erstellung scheinbar automatisiert? Dieser Artikel befasst sich mit den Feinheiten der Ausführung von Vorgängen, die keine Zeilen zurückgeben, und erläutert die Gründe für die Verwendung vorbereiteter Anweisungen.

Warum DB.exec() verwenden?

Es stimmt zwar, dass DB.Query() und DB.exec() kann austauschbar zum Ausführen von SQL-Anweisungen verwendet werden, sie unterscheiden sich in der Art des Ergebnisses, das sie zurückgeben. DB.exec() bietet Einblicke in die Anzahl der von der Abfrage betroffenen Zeilen, während DB.Query() eine Ergebnismenge zurückgibt.

Angenommen, zum Beispiel Sie möchten eine DELETE-Anweisung ausführen und die Anzahl der gelöschten Zeilen ermitteln. Die Verwendung von DB.exec() ist der bevorzugte Ansatz:

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)

Alternativ würde der umständlichere Ansatz darin bestehen, DB.Query() zu verwenden und die Zeilen zu durchlaufen, um sie zu zählen:

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)

Darüber hinaus bietet DB.exec() eine prägnante Lösung, wenn das Ergebnis einer Abfrage irrelevant ist und Sie sie lediglich ausführen müssen:

if _, err := db.Exec(``); err != nil {
    panic(err)
}

Im Gegensatz dazu führt das Weglassen des Close-Aufrufs für den zurückgegebenen Wert DB.Rows bei Verwendung von DB.Query() letztendlich zu einer Überlastung offener Verbindungen aufgrund von Speicherlecks.

Eintauchen in vorbereitete Anweisungen

Während vorgeschlagen wurde, dass Go Wenn automatisch vorbereitete Aussagen erstellt werden, erscheint die Realität differenzierter. Das Verhalten von DB.Query() scheint vom zugrunde liegenden Treiber abzuhängen, der verwendet wird.

Dennoch kann die Vorbereitung und Wiederverwendung von DB.Stmt die Leistung bei häufigen Ausführungen verbessern Abfragen. Ein Blick in die offizielle Postgresql-Dokumentation zeigt, wie vorbereitete Anweisungen Abläufe optimieren können.

Fazit

Verstehen der Unterschiede zwischen DB.exec() und Vorbereitete Anweisungen in Golang helfen Entwicklern, Vorgänge effizient auszuführen, die keine Zeilen zurückgeben, und nutzen die Vorteile vorbereiteter Anweisungen bei der Suche nach Leistungsoptimierungen.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3