go get github.com/go-sql-driver/mysqlpackage 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数据转成stringrow[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')");//获取插入IDins_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();}}
文章转载自天天开怀乐,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




