今天要写个工具就想顺便学下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的一个区别