go的數據庫操作mysql


 
         
go get github.com/go-sql-driver/mysql


package main; import (
"database/sql" _ "github.com/go-sql-driver/mysql" // 包的初始化,執行包中所有的init()方法 具體參見http://blog.csdn.net/wanglei9876/article/details/50475864 "fmt" ) func main() { //打開數據庫 //DSN數據源字符串:用戶名:密碼@協議(地址:端口)/數據庫?參數=參數值 db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/test?charset=utf8"); if err != nil { fmt.Println(err); } //關閉數據庫,db會被多個goroutine共享,可以不調用 defer db.Close(); //查詢數據,指定字段名,返回sql.Rows結果集 rows, _ := db.Query("select id,name from test"); id := 0; name := ""; for rows.Next() { rows.Scan(&id, &name); fmt.Println(id, name); } //查詢數據,取所有字段 rows2, _ := db.Query("select * from test"); //返回所有列 cols, _ := rows2.Columns(); //這里表示一行所有列的值,用[]byte表示 vals := make([][]byte, len(cols)); //這里表示一行填充數據 scans := make([]interface{}, len(cols)); //這里scans引用vals,把數據填充到[]byte里 for k, _ := range vals { scans[k] = &vals[k]; } i := 0; result := make(map[int]map[string]string); for rows2.Next() { //填充數據 rows2.Scan(scans...); //每行數據 row := make(map[string]string); //把vals中的數據復制到row中 for k, v := range vals { key := cols[k]; //這里把[]byte數據轉成string row[key] = string(v); } //放入結果集 result[i] = row; i++; } fmt.Println(result); //查詢一行數據 rows3 := db.QueryRow("select id,name from test where id = ?", 1); rows3.Scan(&id, &name); fmt.Println(id, name); //插入一行數據 ret, _ := db.Exec("insert into test(id,name) values(null, '444')"); //獲取插入ID ins_id, _ := ret.LastInsertId(); fmt.Println(ins_id); //更新數據 ret2, _ := db.Exec("update test set name = '000' where id > ?", 2); //獲取影響行數 aff_nums, _ := ret2.RowsAffected(); fmt.Println(aff_nums); //刪除數據 ret3, _ := db.Exec("delete from test where id = ?", 3); //獲取影響行數 del_nums, _ := ret3.RowsAffected(); fmt.Println(del_nums); //預處理語句 stmt, _ := db.Prepare("select id,name from test where id = ?"); rows4, _ := stmt.Query(3); //注意這里需要Next()下,不然下面取不到值 rows4.Next(); rows4.Scan(&id, &name); fmt.Println(id, name); stmt2, _ := db.Prepare("insert into test values(null, ?, ?)"); rows5, _ := stmt2.Exec("666", 66); fmt.Println(rows5.RowsAffected()); //事務處理 tx, _ := db.Begin(); ret4, _ := tx.Exec("update test set price = price + 100 where id = ?", 1); ret5, _ := tx.Exec("update test set price = price - 100 where id = ?", 2); upd_nums1, _ := ret4.RowsAffected(); upd_nums2, _ := ret5.RowsAffected(); if upd_nums1 > 0 && upd_nums2 > 0 { //只有兩條更新同時成功,那么才提交 tx.Commit(); } else { //否則回滾 tx.Rollback(); } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM