精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go語言操作MySQL語言基礎知識

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

 前言

通常情況下,我們程序員和數據庫打交道是最多的。要然我們怎么會被稱為碼農呢。

存用戶信息需要數據庫,存訂單需要數據庫,等等等等,現在真是數據驅動著發展。

但是數據庫種類有很多,有Mysql,Oracle,SQL Server。

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

準備工作

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

使用的庫是第三方庫go-sql-driver/mysql。

準備工作之連接數據庫

代碼

  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只會驗證dsb的格式是否正確,不會驗證是否連接成功,同理,密碼是否正確也不知道 
  9.     db, err := sql.Open("mysql", dsn) 
  10.     if err != nil { 
  11.         panic(err) 
  12.     //關閉連接在 err 之后,因為可能直接就打開不成功,關閉一個沒有打開的連接??? 
  13.     defer db.Close() 
  14.     // 此時嘗試連接數據庫,會判斷用戶,密碼,ip地址,端口是否正確 
  15.     err = db.Ping() 
  16.     if err != nil { 
  17.         fmt.Println("連接數據庫失敗,",err) 
  18.         return 
  19.     //設置與數據庫建立連接的最大數目,一般不管 
  20.     db.SetMaxOpenConns(100) 
  21.     //設置連接池中的最大閑置連接數,一般不管 
  22.     db.SetMaxIdleConns(50) 

注意

  • sql.Open只會驗證格式是否正確,不會連接數據庫。
  • db.Close在err之后,是因為可能打開不成功,關閉一個沒有打開的連接。
  • db.Ping會連接數據庫,判斷用戶,密碼,ip地址,端口是否正確。

準備工作之創建表

我們創建一個簡單的用戶表。

  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; 

準備工作之創建結構體

假設上述工作都完成了啊。

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

只有結構體是最清晰的,最好認識的。

結構體

  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 第二個參數可以接收多個參數,同理,sqlStr可以有多個 ?占位符 進行匹配 
  6.     QueryRow 之后必須調用Scan方法進行數據綁定,進行數據庫鏈接釋放 
  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

執行結果


查詢多條

多行查詢使用Query。

代碼

  1. //查詢多條 
  2. sqlStr := "SELECT id,`name`,phone,address from userinfo where id >= ?" 
  3. //參數同 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. //循環整理所有數據 
  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("綁定數據失敗", err) 
  17.     return 
  18. userList = append(userList, user
  19. fmt.Println(userList) 

執行結果


插入數據

插入數據需要用到Exec。

代碼

  1. //插入數據 
  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. //受影響的行數 
  8. row_affect, err := result.RowsAffected() 
  9. if err != nil { 
  10.     fmt.Println("受影響行數獲取失敗:", err) 
  11.     return 
  12. fmt.Println("受影響的行數:", 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("插入成功"

執行結果


Mysql


更新數據

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

代碼

  1. //更新數據 
  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. //受影響的行數 
  8. row_affect, err := result.RowsAffected() 
  9. if err != nil { 
  10.     fmt.Println("受影響行數獲取失敗:", err) 
  11.     return 
  12. fmt.Println("受影響的行數:", row_affect) 
  13. fmt.Println("更新成功"

執行結果


Mysql


刪除數據

刪除數據用的還是Exec。

代碼

  1. //刪除數據 
  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. //受影響的行數 
  8. row_affect, err := result.RowsAffected() 
  9. if err != nil { 
  10.     fmt.Println("受影響行數獲取失敗:", err) 
  11.     return 
  12. fmt.Println("受影響的行數:", row_affect) 
  13. fmt.Println("刪除成功"

執行結果


Mysql


事物

事物,這個用的就比較多了,通常用在關鍵的場景。

尤其是轉賬,張三-10塊,李四+10塊,這個動作動作是要在一起完成的。

如果任何一個失敗了,就要恢復上一次的狀態。

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

新建表

  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; 

表數據

張三和李四都剩余100塊


Go Mysql 關于事物相關方法

Go 關于事物有三個方法

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

模擬轉賬:張三-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.         //有錯誤表示更是失敗,回滾原來狀態 
  17.         tx.Rollback() 
  18.         fmt.Println(err) 
  19.         return 
  20.     張三受影響行數, 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.         //有錯誤表示更是失敗,回滾原來狀態 
  29.         tx.Rollback() 
  30.         fmt.Println(err) 
  31.         return 
  32.     李四受影響行數, err := result.RowsAffected() 
  33.     if err != nil { 
  34.         tx.Rollback() // 回滾 
  35.         return 
  36.     //都等于1表示成功,可以提交事務,修改數據 
  37.     if 張三受影響行數==1 && 李四受影響行數==1{ 
  38.         //提交事務 
  39.         fmt.Println("提交事務"
  40.         tx.Commit() 
  41.     }else
  42.         //有一個!=1表示沒有更新成功,可能用戶不存在 
  43.         fmt.Println("失敗了,事物回滾了"
  44.         tx.Rollback() 
  45.     fmt.Println("事物執行成功"

執行結果


Mysql

一加一減


假如出錯了


Mysql

如果使用事物,出錯了數據還是沒變。


總結

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

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

 

責任編輯:姜華 來源: Go語言進階學習
相關推薦

2024-01-07 19:54:51

2010-01-19 14:45:35

C++語言

2020-07-02 16:20:36

MySQLCURD數據庫

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:38:04

java

2011-07-22 10:02:07

java

2023-12-30 10:22:57

Go語言函數開發

2021-04-19 08:35:44

PythonPython語言Python基礎

2021-01-27 10:01:46

MySQL數據庫SQLX

2023-07-03 00:44:26

Go語言MySQL

2010-04-13 18:24:14

Unix操作系統

2010-04-07 15:59:29

Unix操作系統

2025-05-19 10:00:00

MySQL數據庫InnoDB

2018-03-12 22:13:46

GO語言編程軟件

2021-06-09 09:06:52

Go語言算法

2021-02-06 18:19:54

TimeGo語言

2024-12-30 00:38:23

Go語言微服務
點贊
收藏

51CTO技術棧公眾號

成年人视频免费在线播放| 91丝袜超薄交口足| 欧美在线精品一区二区三区| 中日韩视频在线观看| 精品999在线播放| 日本午夜激情视频| 久热av在线| 精品在线免费观看| 久久久久久久97| 国产黄片一区二区三区| av在线亚洲一区| 天天综合天天综合色| 日韩高清国产精品| 亚洲精品成人区在线观看| 久久一区亚洲| 欧美激情第一页xxx| 成人免费无遮挡无码黄漫视频| 色综合一区二区日本韩国亚洲 | 精品乱子伦一区二区三区| 成人免费毛片视频| 欧美另类综合| 日韩在线视频导航| 国产精品无码毛片| 亚洲性视频在线| 欧美精品自拍偷拍| 久热免费在线观看| xxxx视频在线| 亚洲精品欧美专区| 亚洲国产精品一区在线观看不卡| 高潮一区二区三区乱码| 久久国产夜色精品鲁鲁99| 4438全国亚洲精品在线观看视频| 欧美三根一起进三p| 精品国产一区二区三区av片| 精品伦理精品一区| 亚洲精品国产一区二区三区| av高清一区| 黄网动漫久久久| 免费看日b视频| 婷婷在线视频| 国产婷婷色一区二区三区| 国产精品免费一区二区三区观看| 国产特级黄色片| 精品一区二区免费在线观看| 国产福利视频一区| 无码aⅴ精品一区二区三区| 中日韩视频在线观看| 久久噜噜噜精品国产亚洲综合| 私库av在线播放| 亚洲久久久久| 欧美成人高清视频| 国产免费无码一区二区视频| 欧美精品大片| 欧美激情久久久久| 国产大片中文字幕| 亚洲激情影院| 4k岛国日韩精品**专区| 亚洲高清毛片一区二区| 亚洲综合电影一区二区三区| 97成人精品视频在线观看| 精品在线视频免费| 在线亚洲一区| 国产成人综合精品在线| 97人妻精品视频一区| 日本欧美在线观看| 国产精品专区一| 国产精品国产av| 国产一区二区三区蝌蚪| 91丨九色丨国产| 人妻偷人精品一区二区三区| 99re这里只有精品首页| 久久99精品国产一区二区三区| 四虎精品成人影院观看地址| 久久久久一区二区三区四区| 视频在线精品一区| 成人短视频在线| 午夜日韩在线观看| 免费日韩视频在线观看| 国产香蕉久久| 日韩欧美国产小视频| 人妻激情偷乱频一区二区三区| 成人av地址| 亚洲美女自拍视频| 最新日韩免费视频| 禁久久精品乱码| 国产成人精品视频在线| 亚洲特级黄色片| 成人免费看黄yyy456| 久久99影院| 日本天堂在线观看| 亚洲va欧美va人人爽| 少妇性l交大片| 精品一区二区三区中文字幕| 亚洲国产成人久久综合| 亚洲av熟女国产一区二区性色| 91精品91| 日本在线精品视频| 国产成人久久精品77777综合 | 琪琪第一精品导航| 中文天堂在线资源| 国产91在线|亚洲| 四虎一区二区| 国产网红女主播精品视频| 在线观看亚洲一区| 国产亚洲精品成人a| 国产精品探花在线观看| 欧美日韩成人在线视频| 天堂网一区二区| 成人丝袜高跟foot| 亚洲一卡二卡三卡| 亚洲国产福利| 精品日韩一区二区三区免费视频| 在线小视频你懂的| 亚洲人妖在线| 亚洲综合最新在线| jizzjizz在线观看| 欧美日韩国产综合新一区| 五月天婷婷影视| 日韩国产一区二区| 91黑丝高跟在线| 精品人妻一区二区三区蜜桃| 欧美激情一区二区三区| 五十路熟女丰满大屁股| 精品久久国产一区| 日韩一级裸体免费视频| 无码人妻丰满熟妇精品 | 97久久人人超碰caoprom欧美| 免费在线黄色影片| 亚洲妇女屁股眼交7| 狠狠干狠狠操视频| 国产伦精品一区二区三区千人斩 | 91成人在线| 亚洲欧美福利视频| 国产午夜在线播放| 床上的激情91.| 欧美视频在线第一页| 99国内精品久久久久| 中文字幕在线观看日韩| 久久久久久久久黄色| 91婷婷韩国欧美一区二区| 日韩xxxx视频| 国产精品一区二区中文字幕| 色悠悠国产精品| 伊人久久成人网| 国产精品国产三级国产普通话99 | 韩国美女久久| 亚洲女人被黑人巨大进入| 亚洲黄色一区二区| 99麻豆久久久国产精品免费| 黄色一级片在线看| 国产一区二区三区亚洲| 欧美大片在线影院| 亚洲AV无码国产精品午夜字幕| 亚洲美女视频在线| 91丨porny丨九色| 欧美黄在线观看| 成人动漫在线视频| av电影免费在线看| 日韩成人在线电影网| 国产精品久久久久久久妇| 91蜜桃网址入口| 中文字幕第80页| 久久综合成人| 99国产视频| 女人让男人操自己视频在线观看| 日韩激情视频在线| 日韩综合在线观看| 国产精品久久久久永久免费观看 | 肉大捧一出免费观看网站在线播放 | 亚洲成人免费av| 人妻无码一区二区三区| 日日夜夜免费精品| 伊人天天久久大香线蕉av色| 欧美中文高清| 5566成人精品视频免费| 成年人视频在线看| 欧美一级一级性生活免费录像| 日本少妇高清视频| 91亚洲永久精品| 国产日韩欧美久久| 在线成人欧美| 水蜜桃一区二区三区| 日韩一二三区在线观看| 性日韩欧美在线视频| 国产h视频在线观看| 7777精品伊人久久久大香线蕉完整版 | 精品福利在线观看| 大胸美女被爆操| 丁香激情综合国产| 99视频免费播放| 欧美精品网站| 水蜜桃一区二区| 风间由美性色一区二区三区四区| 国产999精品久久久影片官网| 日本网站在线免费观看视频| 亚洲激情久久久| 国产一区二区在线视频聊天| 午夜伊人狠狠久久| www.99re6| 久久综合九色综合久久久精品综合 | 精品97人妻无码中文永久在线| 91一区在线观看| 在线观看视频你懂得| 乱人伦精品视频在线观看| 午夜探花在线观看| 国产亚洲一区二区三区啪| 亚洲一区久久久| 亚洲日本在线观看视频| 98视频在线噜噜噜国产| 黄网站免费在线播放| 亚洲男人天堂手机在线| 内射后入在线观看一区| 欧美日韩三级一区二区| 日本一级片免费看| 亚洲精品视频自拍| 国产精品情侣呻吟对白视频| 99re视频这里只有精品| 成人免费黄色av| 麻豆成人在线观看| 37pao成人国产永久免费视频| 黑丝一区二区| 免费看啪啪网站| 久久在线播放| 日韩片电影在线免费观看| 欧美日韩一本| 国产欧美一区二区三区另类精品| av一级久久| 91在线色戒在线| 亚洲精品伊人| 国产精品入口夜色视频大尺度 | 欧美日韩高清一区| 亚洲成人av网址| 色婷婷久久久综合中文字幕| 国产精品500部| 午夜精品在线视频一区| 一区二区三区免费高清视频| 亚洲日本在线观看| 少妇高潮在线观看| 中文字幕在线不卡| 强制高潮抽搐sm调教高h| 国产精品麻豆久久久| 国产第一页精品| 中文字幕av资源一区| 亚洲欧美va天堂人熟伦| 国产性天天综合网| 一级黄色性视频| 欧美激情资源网| 亚洲色图27p| 最好看的中文字幕久久| 亚洲综合久久av一区二区三区| 国产精品久久99| 国产一区二区播放| 亚洲综合一二三区| 国产污片在线观看| 欧美视频中文字幕在线| 精品国产一区二区三区四| 91黄色免费看| 91福利免费视频| 日韩女同互慰一区二区| 亚洲精品久久久久久久久久| 亚洲国产成人精品电影| 天堂在线中文字幕| 一区二区三区视频免费在线观看 | 免费久久精品| 亚洲国产精品毛片| 天天做天天爱天天综合网| 黄色影视在线观看| 亚洲精选在线| 黄色三级视频在线| 国产自产视频一区二区三区| 国产精品嫩草69影院| bt7086福利一区国产| 麻豆精品免费视频| 中文字幕日韩欧美一区二区三区| 成人自拍小视频| 亚洲第一av色| 五月激情丁香网| 日韩视频在线观看一区二区| 亚洲 欧美 自拍偷拍| 在线观看91久久久久久| 污污片在线免费视频| 欧美综合在线第二页| 欧美日韩破处视频| 国产日韩一区二区| 成人一区而且| 男女猛烈激情xx00免费视频| 日韩在线a电影| 师生出轨h灌满了1v1| 久久精品一区蜜桃臀影院| 紧身裙女教师波多野结衣| 欧美日韩国产限制| 国产精品国产一区二区三区四区 | 在线中文字幕一区二区| 国产日韩欧美中文字幕| 精品呦交小u女在线| 美女隐私在线观看| 91精品国产一区| 爱情电影网av一区二区| 麻豆成人在线播放| 欧美在线黄色| 在线免费视频a| 成人午夜在线视频| 黑人狂躁日本娇小| 日韩欧美在线国产| 亚洲成人久久精品| 日韩中文字幕国产| 中文日产幕无线码一区二区| 92看片淫黄大片看国产片| 亚洲区小说区图片区qvod| wwwjizzjizzcom| 久久se精品一区精品二区| 国产精品无码电影| 依依成人综合视频| 亚洲视频久久久| 一区二区三区视频免费在线观看| 国产一二三在线| 91文字幕巨乱亚洲香蕉| 日韩国产专区| 国产一区二区视频免费在线观看 | 久久久久久久久四区三区| 亚洲成人精品| 亚洲欧美在线精品| 久久久电影一区二区三区| 五月天婷婷综合网| 精品国产乱码久久久久久1区2区 | 性猛交xxxx| 性视频1819p久久| jizz18欧美18| 日本大片免费看| 国产一区二区不卡| 亚洲人做受高潮| 欧美日韩国产综合久久| 国产高清视频在线播放| 日韩男女性生活视频| 亚洲欧洲av| 中文字幕日本最新乱码视频| 99在线视频精品| 日韩久久久久久久久| 精品国产乱码久久久久久老虎| 欧美hdxxx| 国产精品一区二| 日韩一区二区久久| 中国av免费看| 日韩欧美有码在线| 精品亚洲综合| 国产精品福利观看| 不卡一区2区| www.99r| 亚洲另类在线一区| 国产chinasex对白videos麻豆| 欧美床上激情在线观看| 麻豆国产一区二区三区四区| 三级在线免费观看| 国产suv精品一区二区三区| 久久国产在线观看| 亚洲国产成人在线播放| www.youjizz.com在线| 黑人中文字幕一区二区三区| 国产精品嫩草99av在线| 欧美图片一区二区| 欧美午夜影院一区| 国产原创视频在线观看| 国产精品三区在线| 亚洲中字在线| 懂色av粉嫩av蜜臀av一区二区三区| 538prom精品视频线放| 91麻豆免费在线视频| 国产精品一区二区三区四区五区| av不卡在线看| 精品亚洲aⅴ无码一区二区三区| 欧美日韩高清一区二区| 欧美人与性动交α欧美精品图片| 激情五月综合色婷婷一区二区| 亚洲女人av| 亚洲AV成人无码网站天堂久久| 欧美videos中文字幕| 亚洲欧洲高清| 异国色恋浪漫潭| 成人在线视频一区二区| 日本熟女毛茸茸| 久热精品视频在线观看一区| 精品三级av| xx欧美撒尿嘘撒尿xx| 洋洋av久久久久久久一区| 日韩电影免费| 亚洲xxxx18| 久久福利一区| 欧美三级免费看| 国产一区二区三区在线看 | 久久精品一二三区| 美腿丝袜亚洲三区| 日本少妇毛茸茸高潮| 综合网日日天干夜夜久久| 91亚洲无吗| 蜜臀一区二区三区精品免费视频| 亚洲影视资源网| 午夜小视频在线| 久久偷看各类wc女厕嘘嘘偷窃| 久久国产精品色| 亚洲成熟少妇视频在线观看|