iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 28
1
Software Development

Go繁不及備載系列 第 28

# Day28 Golang MySQL 基本操作 CRUD

Day28 Golang MySQL 基本操作 CRUD

資料庫CRUD基本操作

CRUD單字意思為粗魯的,是四種對 row 操作的頭字詞單字縮寫:Create、Read、Update、Delete

【Insert】插入

_, err := db.Exec("INSERT INTO `school`.`teacher`(`name`, `age`) VALUES ('Tiger' , 28)")

也可以使用佔位符(Placeholder 直譯就是地主啦!)來當作臨時變數。
不過每個RDBMS的佔位符不一定相同,在MySQL是以 ? 當作佔位符號。

_, err := db.Exec("INSERT INTO `school`.`teacher`(`name` , `age`) VALUES (? , ?)", teacherName, teacherAge)
func main(){
	insertTeacher("Tom", 51)
}

func insertTeacher(teacherName string, teacherAge int) {
	_, err := db.Exec("INSERT INTO `school`.`teacher`(`name` , `age`) VALUES (? , ?)", teacherName, teacherAge)
	...
}
func insertStudent(studentName string) {
	rs, err := db.Exec("INSERT INTO `school`.`student`(`name`) VALUES (?)", studentName)
	if err != nil {
		log.Println(err)
	}

	rowCount, err := rs.RowsAffected()
	rowId, err := rs.LastInsertId() // 資料表中有Auto_Increment欄位才起作用,回傳剛剛新增的那筆資料ID

	if err != nil {
		log.Fatalln(err)
	}
	fmt.Printf("新增 %d 筆資料,id = %d \n", rowCount, rowId)
}

【Select】選擇、查詢

用Select選擇nameage 欄位來作印出。

rows, err := db.Query("SELECT `name`, `age` FROM `school`.`teacher`")
// rows, err := db.Query("SELECT * FROM `school`.`teacher`") // 也可以使用`Select *`選取全部欄位。
for rows.Next() { // rows.Next() 前往下一個項目。如果成功(還有下一項的話)返回True、失敗(沒有下一項可讀)則返回False
		var tName string	//兩個欄位,依SELECT的順序用兩個變數來接
		var tAge int
	err = rows.Scan(&tName, &tAge) // 掃描後存進變數中
	if err != nil {
		log.Fatalln(err)
	}
	fmt.Printf("%q %d\n", tName, tAge) // %q:quoted 用引號包起字串
}
defer rows.Close() // 當完整迭代rows.Next()完後會自動關閉rows,但以防萬一 最後記得要關閉rows 。

使用條件Where 語法來查詢年紀超過age的老師

func queryTeacherByAge(age int) {
	rows, err := db.Query("SELECT `name`, `age` FROM `school`.`teacher` WHERE `age` > ?;", age)
    ...

db.Query回傳符合結果的多筆資料rows
db.QueryRow用在確定只有一筆資料row回傳的時候。

【Update】更新

更新名字為name的老師的年齡為age

func updateTeacherAge(teacherName string, age int) {
	_, err := db.Exec("UPDATE `school`.`teacher` SET `age`= ? WHERE `name` = ?;", age, teacherName)

【Delete】刪除

刪除名字為name的老師的資料列

func deleteTeacher(teacherName string) {
	_, err := db.Exec("DELETE FROM `school`.`teacher` WHERE `name` = ?;", teacherName)
    ...

在MySQL中,INSERT 可以沒有 INTO,但是 DELETE 不能沒有 FROM

常用SQL函式

因為這些用法是SQL函式,關鍵字後必須加上小括號()

【Count】筆數

年紀資料不為null的老師總數

func numOfTeacher() {
	row := db.QueryRow("SELECT COUNT(`age`) FROM `school`.`teacher`;")
	var count int
	row.Scan(&count)
	fmt.Println(count)
}

【Max, Min】最大最小值

查詢年紀最大的的老師

func oldestAge() {
	row := db.QueryRow("SELECT MAX(`age`) FROM `school`.`teacher`;")
	
	var tAge int
	row.Scan(&tAge)
	fmt.Println("老師年紀最大為:", tAge)
}

相反,用MIN則查詢年紀最小的老師。

也可以使用ORDER BY DESC, Limit來查詢年紀最大者。

func oldestTeacher() {
	row := db.QueryRow("SELECT `name`, `age` FROM `school`.`teacher` ORDER BY `age` DESC Limit 1 ;")

	var tName string
	var tAge int
	row.Scan(&tName, &tAge)
	
	fmt.Println(tName, tAge)
}

【Sum】加總

回傳老師們年紀的加總。

func SumOfTeachersAge() {
	row := db.QueryRow("SELECT SUM(`age`) FROM `school`.`teacher`;")
	var sum int
	row.Scan(&sum)
	fmt.Println(sum)
}

上一篇
# Day27 Golang MySQL 我的資料庫
下一篇
# Day29 Golang 鍵值資料庫 Redis 介紹與安裝
系列文
Go繁不及備載35
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言