ホームページ > データベース > mysql チュートリアル > mymysql与go-mysql-driver的一个差别

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

WBOY
リリース: 2016-06-07 16:23:58
オリジナル
1100 人が閲覧しました

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート