最新消息:

mysql与go-mysql-driver的一个区别

mysql admin 3265浏览 0评论

今天要写个工具就想顺便学下go。网上翻了下发现用比较多的是mymysql和go-mysql-driver。

这两个驱动网上比较的文章也有些了,不过都没有提到一个点,个人觉得是很重要的,记录一下。

先看使用go-mysql-driver的例子。

db,_:=sql.Open("mysql",connect_string)
db.Query("set binlog_format=row")

rows,_:=db.Query("select @@binlog_format")

forrows.Next(){
	varvstring
	rows.Scan(&v)
	fmt.Println(v)  // 输出是MIXED (global值)
}

rows.Close()
db.Close()

从上面的输出可以看到,set语句无效。

原因是在database/sql这个库实现中, 上面的变量db维护的是一个线程池,而不是一个线程,因此前后两次执行db.Query并不保证在同一个session里面。

同样的, set @a=1,这种线程变量也是可能在后续的select中得不到1这个值。

由于mymysql 不是基于database/sql,以下代码能确保输出19

mydb := mysql.New("tcp", "", "ip:port”, user, password, dbname)
mydb.Connect()

mydb.Query("set @a=19")

res, _ := mydb.Start("select @a")

for {
	row, _ := res.GetRow()
	if row == nil {break}
	fmt.Println(row.Str(0))
}

mydb.Close()

转载请注明:爱开源 » mysql与go-mysql-driver的一个区别

您必须 登录 才能发表评论!