繰り返す方法
db.Query( "set @ a = 1")
db.Query( "select @a")
nullを返す
これは、「select @a」が実行されると、ドライブがmysqlサーバー上に新しいセッションを作成するためと思われます。 これはセッションにつながります-変数は使用できません。
database / sqlまたはgithub.com/go-sql-driver/mysqlに関連するメカニズムはありますか?
提供されたサンプルコードには2つの問題があります。
1) db.Query
はrows
を返します。これは、閉じるか、完全に読み取る必要があります(暗黙的に閉じます)。 そうしないと、接続がブロックされ、他のクエリに再利用できなくなります。
2)すでにお察しのとおり、2番目のdb.Queryは、同じ接続で実行されることが保証されていないため、ほとんどの場合、新しいセッションを作成します。 現在、Goのデータベース/ SQLインターフェースを介して接続を予約する唯一の方法は、トランザクションを使用することです: http :
http://go-database-sql.org/にあるdatabase / sqlチュートリアルを読むことをお勧めし
新しいセッションを作成する場合もあれば、同じセッションを使用する場合もあります。 わかりません。 database/sql
によるプーリングに完全に依存しており、変更するためにできることは何もありません。
あなたはできる
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
に設定する機会はありますか?
最も参考になるコメント
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