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();
}
}