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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章