Mysql: セッション変数は使用できませんか?

作成日 2014年01月23日  ·  7コメント  ·  ソース: go-sql-driver/mysql

繰り返す方法
db.Query( "set @ a = 1")
db.Query( "select @a")

nullを返す

これは、「select @a」が実行されると、ドライブがmysqlサーバー上に新しいセッションを作成するためと思われます。 これはセッションにつながります-変​​数は使用できません。

database / sqlまたはgithub.com/go-sql-driver/mysqlに関連するメカニズムはありますか?

databassql issue question

最も参考になるコメント

binlog形式を出力したサンプルコードで、次のように記述しました。

trx、:= db.Begin()
db.Query( "set binlogformat = row")
行、_:= db.Query( "select @@ binlog_format")

そこでdb変数にアクセスすることはできません。 代わりにこれを行う必要があります:

trx、err:= db.Begin()
trx.Query(...)

dbではなくtrxでクエリを実行していることに注意してください。

チュートリアルでは、その方法についてより明確な例を示す必要があるかもしれません。
これを強調する、トランザクションとの「セッション」。 チュートリアルがそうでない場合
あなたに明確に、バグを提出してください
https://github.com/VividCortex/go-database-sql-tutorial/issues

全てのコメント7件

提供されたサンプルコードには2つの問題があります。
1) db.Queryrowsを返します。これは、閉じるか、完全に読み取る必要があります(暗黙的に閉じます)。 そうしないと、接続がブロックされ、他のクエリに再利用できなくなります。
2)すでにお察しのとおり、2番目のdb.Queryは、同じ接続で実行されることが保証されていないため、ほとんどの場合、新しいセッションを作成します。 現在、Goのデータベース/ SQLインターフェースを介して接続を予約する唯一の方法は、トランザクションを使用することです: http

http://go-database-sql.org/にあるdatabase / sqlチュートリアルを読むことをお勧めし

新しいセッションを作成する場合もあれば、同じセッションを使用する場合もあります。 わかりません。 database/sqlによるプーリングに完全に依存しており、変更するためにできることは何もありません。

あなたはできる

  • Goにセッションサポートを追加するための問題を提出し、それが迅速に追加されることを願っています
  • トランザクションで実行します(すべてのクエリに同じ接続を使用します)
  • database/sqlなしでドライバーを使用する
  • 安全でないものを使用して接続を抽出する
  • 変数がSELECT初期化されるようにクエリを書き直します

最後のものの私のレシピ:

SET <strong i="17">@row</strong> := 0;
SELECT <strong i="18">@row</strong> := <strong i="19">@row</strong> + 1, * FROM mytable;

になります

SELECT <strong i="23">@row</strong> := <strong i="24">@row</strong> + 1, t.* FROM (SELECT <strong i="25">@row</strong> := 0) cnt JOIN mytable t;

ただし、すべてのステートメントを1つのステートメントに書き込むことができるわけではありません。
なので

   db, _ := sql.Open("mysql", connect_string)

   trx, _:= db.Begin()
   db.Query("set binlog_format=row")

   rows, _ := db.Query("select @@binlog_format")
   for rows.Next() {
     var v string
     rows.Scan(&v)
     fmt.Println(v)
   }   
   rows.Close()

   trx.Commit()
   db.Close()

グローバル値である「mixed」を出力します。

カンマユーザーにとっては、バグのように見えます。
データベース/ SQLのためですが、そのような場合に対処するために何かできることはありますか?

arnehormannにとって、「データベース/ SQLなしでドライバーを使用する」とはどういう意味ですか? このパッケージをインポートしないと、ビルドに失敗しました

@tbdingqiいいえ、すべてを1つのステートメントに書き込むことができるわけではありません。 しかし、 SET問題のいくつかはその方法で解決できます。

一般ユーザーにはバグのように見えます。
私たちにできることは何もありませんし、あなたにできることもあります。 私はそれらのものをリストしました。
もし何か他のことができたら、私たちはそれをしたか、できるだけ早くそれをするでしょう。
ジュリアンがリンクしているチュートリアルを読んでください。APIの制限について説明しています。

インポート:代わりにimport "github.com/go-sql-driver/mysql"使用できます

import (
  "database/sql"
  _  "github.com/go-sql-driver/mysql"
)

database/sqlなしでドライバーに直接話しかけます。

binlog形式を出力したサンプルコードで、次のように記述しました。

trx、:= db.Begin()
db.Query( "set binlogformat = row")
行、_:= db.Query( "select @@ binlog_format")

そこでdb変数にアクセスすることはできません。 代わりにこれを行う必要があります:

trx、err:= db.Begin()
trx.Query(...)

dbではなくtrxでクエリを実行していることに注意してください。

チュートリアルでは、その方法についてより明確な例を示す必要があるかもしれません。
これを強調する、トランザクションとの「セッション」。 チュートリアルがそうでない場合
あなたに明確に、バグを提出してください
https://github.com/VividCortex/go-database-sql-tutorial/issues

@xaprb良いキャッチ、私はTxの誤用を逃しました。

このメソッドは、 sql_log_binような変数では機能しません。
Mysql自体はエラーを出します:
ERROR 1694 (HY000): Cannot modify @@session.sql_log_bin inside a transaction

この変数を*sql.DBに設定する機会はありますか?

このページは役に立ちましたか?
0 / 5 - 0 評価