成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go語(yǔ)言操作MySQL語(yǔ)言基礎(chǔ)知識(shí)

數(shù)據(jù)庫(kù) MySQL
本次主要講述了Go如何操作Mysql,如何進(jìn)行增刪改查,最后還講了以下什么是事物,如何操作事物。

 前言

通常情況下,我們程序員和數(shù)據(jù)庫(kù)打交道是最多的。要然我們?cè)趺磿?huì)被稱為碼農(nóng)呢。

存用戶信息需要數(shù)據(jù)庫(kù),存訂單需要數(shù)據(jù)庫(kù),等等等等,現(xiàn)在真是數(shù)據(jù)驅(qū)動(dòng)著發(fā)展。

但是數(shù)據(jù)庫(kù)種類有很多,有Mysql,Oracle,SQL Server。

本篇就示例如何Go操作Mysql。

準(zhǔn)備工作

本次使用的是go mod進(jìn)行包依賴管理,還不會(huì)使用的向上爬梯子,找go mod用法。

使用的庫(kù)是第三方庫(kù)go-sql-driver/mysql。

準(zhǔn)備工作之連接數(shù)據(jù)庫(kù)

代碼

  1. func main() { 
  2.     var username = "root" 
  3.     var password = "rootroot" 
  4.     var ip = "127.0.0.1" 
  5.     var port = "3306" 
  6.     var data = "go_mysql_demo" 
  7.     var dsn = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", username, password, ip, port, data) 
  8.     //Open只會(huì)驗(yàn)證dsb的格式是否正確,不會(huì)驗(yàn)證是否連接成功,同理,密碼是否正確也不知道 
  9.     db, err := sql.Open("mysql", dsn) 
  10.     if err != nil { 
  11.         panic(err) 
  12.     //關(guān)閉連接在 err 之后,因?yàn)榭赡苤苯泳痛蜷_不成功,關(guān)閉一個(gè)沒有打開的連接??? 
  13.     defer db.Close() 
  14.     // 此時(shí)嘗試連接數(shù)據(jù)庫(kù),會(huì)判斷用戶,密碼,ip地址,端口是否正確 
  15.     err = db.Ping() 
  16.     if err != nil { 
  17.         fmt.Println("連接數(shù)據(jù)庫(kù)失敗,",err) 
  18.         return 
  19.     //設(shè)置與數(shù)據(jù)庫(kù)建立連接的最大數(shù)目,一般不管 
  20.     db.SetMaxOpenConns(100) 
  21.     //設(shè)置連接池中的最大閑置連接數(shù),一般不管 
  22.     db.SetMaxIdleConns(50) 

注意

  • sql.Open只會(huì)驗(yàn)證格式是否正確,不會(huì)連接數(shù)據(jù)庫(kù)。
  • db.Close在err之后,是因?yàn)榭赡艽蜷_不成功,關(guān)閉一個(gè)沒有打開的連接。
  • db.Ping會(huì)連接數(shù)據(jù)庫(kù),判斷用戶,密碼,ip地址,端口是否正確。

準(zhǔn)備工作之創(chuàng)建表

我們創(chuàng)建一個(gè)簡(jiǎn)單的用戶表。

  1. CREATE TABLE `userinfo` ( 
  2.   `id` int(11) NOT NULL AUTO_INCREMENT, 
  3.   `namevarchar(10) DEFAULT NULL, 
  4.   `phone` char(11) DEFAULT NULL, 
  5.   `address` varchar(64) DEFAULT NULL, 
  6.   PRIMARY KEY (`id`) 
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

準(zhǔn)備工作之創(chuàng)建結(jié)構(gòu)體

假設(shè)上述工作都完成了啊。

不知道有沒有想過,我們查詢的數(shù)據(jù),存成啥?,字符串?map?切片?,似乎都不是太好。

只有結(jié)構(gòu)體是最清晰的,最好認(rèn)識(shí)的。

結(jié)構(gòu)體

  1. type Userinfo struct { 
  2.     Id      int64  `json:"id"
  3.     Name    string `json:"name"
  4.     Phone   string `json:"phone"
  5.     Address string `json:"address"

查詢單條

單條查詢使用QueryRow方法。

代碼

  1. //查詢單條 
  2. sqlStr := "SELECT id,`name`,phone,address from userinfo where id = ?;" 
  3. var user Userinfo 
  4. /* 
  5.     QueryRow 第二個(gè)參數(shù)可以接收多個(gè)參數(shù),同理,sqlStr可以有多個(gè) ?占位符 進(jìn)行匹配 
  6.     QueryRow 之后必須調(diào)用Scan方法進(jìn)行數(shù)據(jù)綁定,進(jìn)行數(shù)據(jù)庫(kù)鏈接釋放 
  7. */ 
  8. err = db.QueryRow(sqlStr, 1).Scan(&user.Id, &user.Name, &user.Phone, &user.Address) 
  9. if err != nil { 
  10.     fmt.Println("查詢失敗", err) 
  11.     return 
  12. fmt.Println(user

執(zhí)行結(jié)果


查詢多條

多行查詢使用Query。

代碼

  1. //查詢多條 
  2. sqlStr := "SELECT id,`name`,phone,address from userinfo where id >= ?" 
  3. //參數(shù)同 QueryRow 
  4. rows, err := db.Query(sqlStr, 1) 
  5. if err != nil { 
  6.     fmt.Println("查詢失敗:", err) 
  7.     return 
  8. // 此處使用rows釋放所有鏈接 
  9. defer rows.Close() 
  10. //循環(huán)整理所有數(shù)據(jù) 
  11. var userList = make([]Userinfo, 0, 10) 
  12. for rows.Next() { 
  13. var user Userinfo 
  14. err = rows.Scan(&user.Id, &user.Name, &user.Phone, &user.Address) 
  15. if err != nil { 
  16.     fmt.Println("綁定數(shù)據(jù)失敗", err) 
  17.     return 
  18. userList = append(userList, user
  19. fmt.Println(userList) 

執(zhí)行結(jié)果


插入數(shù)據(jù)

插入數(shù)據(jù)需要用到Exec。

代碼

  1. //插入數(shù)據(jù) 
  2. sqlStr := "INSERT into userinfo(name,phone,address) values(?,?,?);" 
  3. result, err := db.Exec(sqlStr, "吳彥祖", 555, "不知道哪的"
  4. if err != nil { 
  5.     fmt.Println("插入失敗", err) 
  6.     return 
  7. //受影響的行數(shù) 
  8. row_affect, err := result.RowsAffected() 
  9. if err != nil { 
  10.     fmt.Println("受影響行數(shù)獲取失敗:", err) 
  11.     return 
  12. fmt.Println("受影響的行數(shù):", row_affect) 
  13. lastId, err := result.LastInsertId() 
  14. if err != nil { 
  15.     fmt.Println("新增行id獲取失敗:", err) 
  16.     return 
  17. fmt.Println("新增行id:", lastId) 
  18. fmt.Println("插入成功"

執(zhí)行結(jié)果


Mysql


更新數(shù)據(jù)

更新和添加差不多,用的都是Exec。

代碼

  1. //更新數(shù)據(jù) 
  2. sqlStr := `UPDATE userinfo set name=? where id=?;` 
  3. result, err := db.Exec(sqlStr, "吳彥祖666", 3) 
  4. if err != nil { 
  5.     fmt.Println("更新失敗", err) 
  6.     return 
  7. //受影響的行數(shù) 
  8. row_affect, err := result.RowsAffected() 
  9. if err != nil { 
  10.     fmt.Println("受影響行數(shù)獲取失敗:", err) 
  11.     return 
  12. fmt.Println("受影響的行數(shù):", row_affect) 
  13. fmt.Println("更新成功"

執(zhí)行結(jié)果


Mysql


刪除數(shù)據(jù)

刪除數(shù)據(jù)用的還是Exec。

代碼

  1. //刪除數(shù)據(jù) 
  2. sqlStr := "delete from userinfo where id = ?;" 
  3. result, err := db.Exec(sqlStr, 3) 
  4. if err != nil { 
  5.     fmt.Println("刪除失敗", err) 
  6.     return 
  7. //受影響的行數(shù) 
  8. row_affect, err := result.RowsAffected() 
  9. if err != nil { 
  10.     fmt.Println("受影響行數(shù)獲取失敗:", err) 
  11.     return 
  12. fmt.Println("受影響的行數(shù):", row_affect) 
  13. fmt.Println("刪除成功"

執(zhí)行結(jié)果


Mysql


事物

事物,這個(gè)用的就比較多了,通常用在關(guān)鍵的場(chǎng)景。

尤其是轉(zhuǎn)賬,張三-10塊,李四+10塊,這個(gè)動(dòng)作動(dòng)作是要在一起完成的。

如果任何一個(gè)失敗了,就要恢復(fù)上一次的狀態(tài)。

我們通常也叫這個(gè)操作叫做原子操作,要成功,都成功,要完蛋,都完蛋。

新建表

  1. CREATE TABLE `bill` ( 
  2.   `id` int(11) NOT NULL AUTO_INCREMENT, 
  3.   `namevarchar(8) NOT NULL, 
  4.   `money` int(11) NOT NULL, 
  5.   PRIMARY KEY (`id`) 
  6. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4; 

表數(shù)據(jù)

張三和李四都剩余100塊


Go Mysql 關(guān)于事物相關(guān)方法

Go 關(guān)于事物有三個(gè)方法

  • Begin()開始事物。
  • Commit()提交事物。
  • Rollback()失敗回滾。

模擬轉(zhuǎn)賬:張三-10塊,李四+十塊

代碼

  1. func main() { 
  2.     //事物 
  3.     //開啟事物 
  4.     tx, err := db.Begin() 
  5.     if err != nil { 
  6.         //釋放事物 
  7.         if tx != nil { 
  8.             tx.Rollback() 
  9.         } 
  10.         fmt.Println("事物開啟失敗"
  11.         return 
  12.  
  13.     張三減10塊Sql := `UPDATE bill set money=money - 10 where name = ?;` 
  14.     result, err := tx.Exec(張三減10塊Sql, "張三"
  15.     if err != nil { 
  16.         //有錯(cuò)誤表示更是失敗,回滾原來(lái)狀態(tài) 
  17.         tx.Rollback() 
  18.         fmt.Println(err) 
  19.         return 
  20.     張三受影響行數(shù), err := result.RowsAffected() 
  21.     if err != nil { 
  22.         tx.Rollback() // 回滾 
  23.         return 
  24.  
  25.     李四加10塊Sql := `UPDATE bill set money=money + 10 where name = ?;` 
  26.     result, err = tx.Exec(李四加10塊Sql, "李四"
  27.     if err != nil { 
  28.         //有錯(cuò)誤表示更是失敗,回滾原來(lái)狀態(tài) 
  29.         tx.Rollback() 
  30.         fmt.Println(err) 
  31.         return 
  32.     李四受影響行數(shù), err := result.RowsAffected() 
  33.     if err != nil { 
  34.         tx.Rollback() // 回滾 
  35.         return 
  36.     //都等于1表示成功,可以提交事務(wù),修改數(shù)據(jù) 
  37.     if 張三受影響行數(shù)==1 && 李四受影響行數(shù)==1{ 
  38.         //提交事務(wù) 
  39.         fmt.Println("提交事務(wù)"
  40.         tx.Commit() 
  41.     }else
  42.         //有一個(gè)!=1表示沒有更新成功,可能用戶不存在 
  43.         fmt.Println("失敗了,事物回滾了"
  44.         tx.Rollback() 
  45.     fmt.Println("事物執(zhí)行成功"

執(zhí)行結(jié)果


Mysql

一加一減


假如出錯(cuò)了


Mysql

如果使用事物,出錯(cuò)了數(shù)據(jù)還是沒變。


總結(jié)

本次主要講述了Go如何操作Mysql,如何進(jìn)行增刪改查,最后還講了以下什么是事物,如何操作事物。

當(dāng)然,這種是最原始的方法,過程有些繁瑣,了解入門就好,后面還有更方便的方法。

 

責(zé)任編輯:姜華 來(lái)源: Go語(yǔ)言進(jìn)階學(xué)習(xí)
相關(guān)推薦

2024-01-07 19:54:51

2010-01-19 14:45:35

C++語(yǔ)言

2020-07-02 16:20:36

MySQLCURD數(shù)據(jù)庫(kù)

2011-07-21 17:45:02

java

2011-07-22 09:43:37

java

2011-07-21 17:33:27

JAVA

2011-07-21 17:18:52

java

2011-07-22 10:02:07

java

2011-07-22 10:38:04

java

2021-04-19 08:35:44

PythonPython語(yǔ)言Python基礎(chǔ)

2023-12-30 10:22:57

Go語(yǔ)言函數(shù)開發(fā)

2021-01-27 10:01:46

MySQL數(shù)據(jù)庫(kù)SQLX

2023-07-03 00:44:26

Go語(yǔ)言MySQL

2010-04-13 18:24:14

Unix操作系統(tǒng)

2010-04-07 15:59:29

Unix操作系統(tǒng)

2025-05-19 10:00:00

MySQL數(shù)據(jù)庫(kù)InnoDB

2018-03-12 22:13:46

GO語(yǔ)言編程軟件

2021-06-09 09:06:52

Go語(yǔ)言算法

2021-02-06 18:19:54

TimeGo語(yǔ)言

2009-08-19 17:13:15

C# 操作符基礎(chǔ)知識(shí)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩视频一区二区三区 | 1000部精品久久久久久久久 | 视频精品一区二区三区 | 国产粉嫩尤物极品99综合精品 | 国产精品久久久久9999鸭 | 羞羞色视频| 日韩一区二 | 一级久久久久久 | 一区二区中文字幕 | 日本欧美国产 | 亚洲国产激情 | 国产精品久久久久久久 | 91天堂 | 亚洲综合色网站 | 天天操 天天操 | 日本在线视频不卡 | www.久草.com| 2020国产在线 | 亚洲日日操| 欧洲av一区| 国产一级片精品 | 国产精品久久久久免费 | 精品国产不卡一区二区三区 | 亚洲天堂999 | 91精品国产美女在线观看 | 一区二区三区不卡视频 | 午夜在线 | 亚洲资源在线 | 免费特黄视频 | 日日天天 | 91av免费版 | 久久草在线视频 | 精品在线观看入口 | 中文字幕一区二区三区精彩视频 | 成人av免费看 | 美人の美乳で授乳プレイ | 99av成人精品国语自产拍 | 成人a在线 | 一区二区三区小视频 | 国产精品久久性 | 亚洲精精品 |