欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

mymysql与go-mysql-driver的一个差别

程序员文章站 2022-04-18 23:38:43
...

mymysql与go-mysql-driver的一个区别 今天要写个工具就想顺便学下 go 。网上翻了下发现用比较多的是 mymysql 和 go-mysql-driver 。 ?? 这两个驱动网上比较的文章也有些了,不过都没有提到一个点,个人觉得是很重要的,记录一下。 ?? ?????? 先看使用 go-mysq

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

今天要写个工具就想顺便学下go。网上翻了下发现用比较多的是mymysqlgo-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()