go的系統包裏是沒有數據庫驅動的,首先先從git上下載mysql包,golang下載資源包至關方便,打開命令行,輸入命令:go get -u github.com/go-sql-driver/mysql
(使用git命令下載資源包,須要先安裝git,沒安裝git的同窗能夠手動下載後放入src目錄下)。!mysql
下載完成會在GOPATH下的src裏多了資源包git
下載完成後,在項目裏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)
執行結果:數組
解析:
查詢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)
執行結果:函數
解析:
查詢年齡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)
執行結果:
解析:
新增一位40歲的女性林醫生result, err := db.Exec("insert into doctor_tb(name,age,sex,addTime) values(?,?,?,Now())", "林醫生", 40, 2)
新增數據的IDresult.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)
執行結果:
解析:
編號爲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)
執行結果:
解析:
刪除姓名叫葉子的醫生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("回退事務成功") }
執行結果:
解析:
準備事務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()
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等。改天會寫下教程。