package
0.0.0-20240927143213-b11bb4fab650
Repository: https://github.com/jocelynh1110/go-practice.git
Documentation: pkg.go.dev

# README

13-7 更新既資料

更新既有資料跟插入資料的動作是很像的。

例、更新資料

package main

import (
	"database/sql"
	"fmt"

	_ "github.com/go-sql-driver/mysql"
)

type employee struct {
	id   int
	name string
}

func main() {
	db, err := sql.Open("mysql", "jocelyn:1234@tcp(localhost:3306)/mysqldb?charset=utf8")
	if err != nil {
		panic(err)
	}
	defer db.Close()
	fmt.Println("sql.DB 結構已建立")
	err = db.Ping()
	if err != nil {
		panic(err)
	}
	fmt.Println("資料庫連線成功")

	// 產生參數化查詢敘述
	updateStmt, err := db.Prepare("UPDATE employee SET name=? WHERE id=?")
	if err != nil {
		panic(err)
	}
	defer updateStmt.Close()

	// 更改原有資料,並執行參數化查詢
	e := employee{305, "Mary"}
	updateResult, err := updateStmt.Exec(e.name, e.id)
	if err != nil {
		panic(err)
	}

	// 檢查更新時影響了幾筆資料
	updateRecords, err := updateResult.RowsAffected()
	if err != nil {
		panic(err)
	}
	fmt.Println("更新資料比數:", updateRecords)
}

顯示結果:

sql.DB 結構已建立
資料庫連線成功
更新資料比數: 0

解析:
更新的過程跟插入資料幾乎一樣,都是先用 db.Prepare() 產生參數化查詢敘述 updateStmt 後,再用 updateStmt.Exec() 來執行和傳入參數。
在此也用了 RowsAffected() 方法來檢視更新時影響了幾筆資料。