首頁 >後端開發 >Golang >如何使用Prepared語句有效率地將多行資料插入Go資料庫?

如何使用Prepared語句有效率地將多行資料插入Go資料庫?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-23 01:36:26785瀏覽

How Can I Efficiently Insert Multiple Rows of Data into a Go Database Using Prepared Statements?

Go 中高效的多資料插入

一次操作將多條資料行插入資料庫可以顯著提高效率。在 Go 中,實現此目的的常見方法是使用準備好的語句。雖然使用問題中演示的字串連接可能看起來很方便,但它不太安全,並且可能導致 SQL 注入漏洞。

使用準備好的語句

使用插入多行準備好的語句,您可以按照以下步驟操作:

  1. 使用資料的佔位符建立模板SQL語句值:
INSERT INTO test(n1, n2, n3) VALUES (?, ?, ?)
  1. 使用 db.Prepare方法準備語句:
stmt, err := db.Prepare(sqlStr)
if err != nil {
    // Handle error
}
  1. 為每行構造一個值切片:
vals := []interface{}{}

for _, dataRow := range data {
    vals = append(vals, dataRow["v1"], dataRow["v2"], dataRow["v3"])
}
  1. 執行具有值的語句:
res, err := stmt.Exec(vals...)
if err != nil {
    // Handle error
}

此方法確保SQL語句僅解析一次,且值作為參數安全插入。

範例:

這是使用準備好的將多行插入「測試」表的範例聲明:

import (
    "database/sql"
    "fmt"
)

type DataRow struct {
    v1 string
    v2 string
    v3 string
}

func main() {
    data := []DataRow{
        {v1: "1", v2: "1", v3: "1"},
        {v1: "2", v2: "2", v3: "2"},
        {v1: "3", v2: "3", v3: "3"},
    }

    db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database")
    if err != nil {
        // Handle error
    }

    sqlStr := "INSERT INTO test(n1, n2, n3) VALUES (?, ?, ?)"
    stmt, err := db.Prepare(sqlStr)
    if err != nil {
        // Handle error
    }

    vals := []interface{}{}
    for _, dataRow := range data {
        vals = append(vals, dataRow.v1, dataRow.v2, dataRow.v3)
    }

    res, err := stmt.Exec(vals...)
    if err != nil {
        // Handle error
    }

    affectedRows, err := res.RowsAffected()
    if err != nil {
        // Handle error
    }

    fmt.Printf("Inserted %d rows", affectedRows)
}

以上是如何使用Prepared語句有效率地將多行資料插入Go資料庫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn