golang 操做mysql示例(增、刪、改、查、事務)

準備

go的系統包裏是沒有數據庫驅動的,首先先從git上下載mysql包,golang下載資源包至關方便,打開命令行,輸入命令:go get -u github.com/go-sql-driver/mysql (使用git命令下載資源包,須要先安裝git,沒安裝git的同窗能夠手動下載後放入src目錄下)。!mysql

2e2be904d71d2926cbe363ee96ca89e.png

下載完成會在GOPATH下的src裏多了資源包git

image.png

下載完成後,在項目裏import mysql包,用下劃線_是表示咱們只須要用到包裏的init()函數,而不須要調用裏面的方法。github

import (  
    "database/sql"  
    "fmt"  
    _ "github.com/go-sql-driver/mysql" //導入mysql包  
    "time"  
)

準備數據表

咱們來準備一張醫生表doctor_tb,包含姓名、年齡、性別、添加時間等,後面咱們會對這張表作增刪改查的操做。建表語句以下:golang

CREATE TABLE `doctor_tb` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT '' COMMENT '姓名',
  `age` int(11) DEFAULT '0' COMMENT '年齡',
  `sex` int(11) DEFAULT '0' COMMENT '性別',
  `addTime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='醫生表';

一、打開數據庫連接

db, err := sql.Open("mysql", "root:112233@tcp(127.0.0.1:3305)/test?charset=utf8&parseTime=True")
mysql數據庫的連接字符串組織:用戶名:密碼@tcp(數據庫IP:端口)/數據庫名?charset=utf8&parseTime=True,若是你的表裏有應用到datetime字段,記得要加上parseTime=True,否則解析不了這個類型。sql

//-------一、打開數據庫--------  
db, err := sql.Open("mysql", "root:112233@tcp(127.0.0.1:3305)/test?charset=utf8&parseTime=True")  
if err != nil {  
   fmt.Println("數據庫連接錯誤", err)  
   return  
}  
//延遲到函數結束關閉連接  
defer db.Close()

二、查詢單條數據

代碼:數據庫

//-------二、查詢單條數據--------  
//定義接收數據的結構  
var doc Doctor  
//執行單條查詢  
rows := db.QueryRow("select * from doctor_tb where id = ?", 1)  
rows.Scan(&doc.ID, &doc.Name, &doc.Age, &doc.Sex, &doc.AddTime)  
fmt.Println("單條數據結果:", doc)

執行結果:
90127e15e23b181b21506afe7c0e986.png數組

解析:
查詢id=1的數據
rows := db.QueryRow("select * from doctor_tb where id = ?", 1)
rows.Scan 用於把讀取的數據賦值到Doctor對象的屬性上,要注意字段順序。app

三、查詢數據列表

代碼:tcp

//-------三、查詢數據列表--------  
rows2, err := db.Query("select * from doctor_tb where age > ?", 18)  
if err != nil {  
   fmt.Println("多條數據查詢錯誤", err)  
   return  
}  
//定義對象數組,用於接收數據  
var docList []Doctor  
for rows2.Next() {  
    var doc2 Doctor  
    rows2.Scan(&doc2.ID, &doc2.Name, &doc2.Age, &doc2.Sex, &doc2.AddTime)  
    //加入數組  
    docList = append(docList, doc2)  
}  
fmt.Println("多條數據查詢結果", docList)

執行結果:
d435bde93cc4fa77f88d28ec9a30fd8.png函數

解析:
查詢年齡age大於18歲的成年醫生
rows2, err := db.Query("select * from doctor_tb where age > ?", 18)
迭代數據查詢
rows2.Next()
賦值
rows2.Scan(&doc2.ID, &doc2.Name, &doc2.Age, &doc2.Sex, &doc2.AddTime)
加入數組
docList = append(docList, doc2)

四、新增數據

代碼:

//-------四、新增數據--------  
result, err := db.Exec("insert into doctor_tb(name,age,sex,addTime) values(?,?,?,Now())", "林醫生", 40, 2)
if err != nil {  
   fmt.Println("新增數據錯誤", err)  
   return  
}  
newID, _ := result.LastInsertId() //新增數據的ID  
i, _ := result.RowsAffected()     //受影響行數  
fmt.Printf("新增的數據ID:%d , 受影響行數:%d \n", newID, i)

執行結果:
aae9fab1f6dbd77f1a71670fc29f426.png

解析:
新增一位40歲的女性林醫生
result, err := db.Exec("insert into doctor_tb(name,age,sex,addTime) values(?,?,?,Now())", "林醫生", 40, 2)
新增數據的ID
result.LastInsertId()
受影響行數
result.RowsAffected()

五、修改數據

代碼:

//-------五、修改數據--------  
result2, err := db.Exec("update doctor_tb set age=20 where id = ?", 1)  
if err != nil {  
   fmt.Println("修改數據錯誤", err)  
   return  
}  
i2, _ := result2.RowsAffected() //受影響行數  
fmt.Printf("受影響行數:%d \n", i2)

執行結果:
image.png

解析:
編號爲1的醫生年齡變爲20歲
result2, err := db.Exec("update doctor_tb set age=20 where id = ?", 1)

六、刪除數據

代碼:

//-------六、刪除數據--------  
result3, err := db.Exec("delete from doctor_tb where name = ?", "葉子")  
if err != nil {  
   fmt.Println("刪除數據錯誤", err)  
   return  
}  
i3, _ := result3.RowsAffected()  
fmt.Printf("受影響行數:%d \n", i3)

執行結果:
image.png

解析:
刪除姓名叫葉子的醫生
result3, err := db.Exec("delete from doctor_tb where name = ?", "葉子")

七、事務

代碼:

//-------七、事務\--------  
tx, _ := db.Begin()  
result4, _ := tx.Exec("update doctor_tb set age = age + 1 where name = ?", "鍾南山")  
result5, _ := tx.Exec("update doctor_tb set age = age + 1 where name = ?", "葉子")  
  
//影響行數,爲0則失敗
i4, _ := result4.RowsAffected()  
i5, _ := result5.RowsAffected()  
if i4 > 0 && i5 > 0 {  
   //2條數據都更新成功才提交事務  
  err = tx.Commit()  
   if err != nil {  
      fmt.Println("事務提交失敗", err)  
      return  
  }  
   fmt.Println("事務提交成功")  
} else {  
   //不然回退事務  
  err = tx.Rollback()  
   if err != nil {  
      fmt.Println("回退事務失敗", err)  
      return  
  }  
   fmt.Println("回退事務成功")  
}

執行結果:
image.png

解析:
準備事務
tx, _ := db.Begin()
鍾南山年齡加1歲
result4, _ := tx.Exec("update doctor_tb set age = age + 1 where name = ?", "鍾南山")
葉子年齡加1歲
result5, _ := tx.Exec("update doctor_tb set age = age + 1 where name = ?", "葉子")
若是2條數據更新能成功則提交事務
err = tx.Commit()
不然回退事務,一切就當沒發生過
tx.Rollback()

完整demo代碼

package main  
  
import (  
    "database/sql"  
    "fmt"  
    _ "github.com/go-sql-driver/mysql" //導入mysql包  
    "time"  
)  
  
type Doctor struct {  
   ID      int64  
   Name    string  
   Age     int  
   Sex     int  
   AddTime time.Time  
}  
  
func main() {  
 //-------一、打開數據庫--------  
  db, err := sql.Open("mysql", "root:112233@tcp(127.0.0.1:3305)/test?charset=utf8&parseTime=True")  
   if err != nil {  
      fmt.Println("數據庫連接錯誤", err)  
      return  
  }  
   //延遲到函數結束關閉連接  
  defer db.Close()  
  
   //-------二、查詢單條數據--------  
 //定義接收數據的結構  
  var doc Doctor  
  //執行單條查詢  
  rows := db.QueryRow("select * from doctor_tb where id = ?", 1)  
   rows.Scan(&doc.ID, &doc.Name, &doc.Age, &doc.Sex, &doc.AddTime)  
   fmt.Println("單條數據結果:", doc)  
  
   //-------三、查詢數據列表--------  
  rows2, err := db.Query("select * from doctor_tb where age > ?", 18)  
   if err != nil {  
      fmt.Println("多條數據查詢錯誤", err)  
      return  
  }  
   //定義對象數組,用於接收數據  
  var docList []Doctor  
  for rows2.Next() {  
      var doc2 Doctor  
  rows2.Scan(&doc2.ID, &doc2.Name, &doc2.Age, &doc2.Sex, &doc2.AddTime)  
      //加入數組  
  docList = append(docList, doc2)  
   }  
   fmt.Println("多條數據查詢結果", docList)  
  
   //-------四、新增數據--------  
  result, err := db.Exec("insert into doctor_tb(name,age,sex,addTime) values(?,?,?,Now())", "林醫生", 40, 2)  
   if err != nil {  
      fmt.Println("新增數據錯誤", err)  
      return  
  }  
   newID, _ := result.LastInsertId() //新增數據的ID  
  i, _ := result.RowsAffected()     //受影響行數  
  fmt.Printf("新增的數據ID:%d , 受影響行數:%d \n", newID, i)  
  
   //-------五、修改數據--------  
  result2, err := db.Exec("update doctor_tb set age=20 where id = ?", 1)  
   if err != nil {  
      fmt.Println("修改數據錯誤", err)  
      return  
  }  
   i2, _ := result2.RowsAffected() //受影響行數  
  fmt.Printf("受影響行數:%d \n", i2)  
  
   //-------六、刪除數據--------  
  result3, err := db.Exec("delete from doctor_tb where name = ?", "葉子")  
   if err != nil {  
      fmt.Println("刪除數據錯誤", err)  
      return  
  }  
   i3, _ := result3.RowsAffected()  
   fmt.Printf("受影響行數:%d \\n", i3)  
  
   //-------七、事務--------  
  tx, _ := db.Begin()  
   result4, _ := tx.Exec("update doctor_tb set age = age + 1 where name = ?", "鍾南山")  
   result5, _ := tx.Exec("update doctor_tb set age = age + 1 where name = ?", "葉子")  
  
   //影響行數,爲0則失敗  
   i4, _ := result4.RowsAffected()  
   i5, _ := result5.RowsAffected()  
   if i4 > 0 && i5 > 0 {  
      //2條數據都更新成功才提交事務  
  err = tx.Commit()  
      if err != nil {  
         fmt.Println("事務提交失敗", err)  
         return  
  }  
      fmt.Println("事務提交成功")  
   } else {  
      //不然回退事務  
  err = tx.Rollback()  
      if err != nil {  
         fmt.Println("回退事務失敗", err)  
         return  
  }  
      fmt.Println("回退事務成功")  
   }  
}

總結

以上就是golang操做mysql的示例。固然還有不少優秀的golang的orm能更方便於咱們平常的業務開發,例如grom,xorm等。改天會寫下教程。

相關文章
相關標籤/搜索