mymysql与go-mysql-driver的一个差别
mymysql与go-mysql-driver的一个区别 今天要写个工具就想顺便学下 go 。网上翻了下发现用比较多的是 mymysql 和 go-mysql-driver 。 ?? 这两个驱动网上比较的文章也有些了,不过都没有提到一个点,个人觉得是很重要的,记录一下。 ?? ?????? 先看使用 go-mysq
mymysql与go-mysql-driver的一个区别今天要写个工具就想顺便学下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()
推荐阅读
-
在ecshop的购物流程页,商品列表加一个复选框,并实现与之相对应功能的代码,该怎么处理
-
一个PHP的QRcode类与大家分享
-
More Effective C++----(12)理解"抛出一个异常"与"传递一个参数"或"调用一个虚函数"间的差异
-
一个级联菜单代码学习及removeClass与addClass的应用_javascript技巧
-
关于PHP函数声明与调用的一个小疑点
-
ios开发:一个音乐播放器的设计与实现案例
-
ios开发:一个音乐播放器的设计与实现案例
-
如何自己做一个网站,制作个人网站的流程与步骤
-
sql not in 与not exists使用中的细微差别
-
photoshopCS5与3D工具设计制作出一个逼真的旋转的大红灯笼