加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

go语言中操作mysql的方法

发布时间:2020-12-16 18:02:35 所属栏目:大数据 来源:网络整理
导读:需要下载指定的golang的mysql驱动包 go get github.com/go-sql-driver/mysql 下面的例子: package main;import ("database/sql"_ "github.com/go-sql-driver/mysql""fmt")func main() {//打开数据库//DSN数据源字符串:用户名:密码@协议(地址:端口)/数据库?

需要下载指定的golang的mysql驱动包

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

下面的例子:

package main;

import (
	"database/sql"
	_ "github.com/go-sql-driver/mysql"
	"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);

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

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读