如何重复
db.Query(“ set @ a = 1”)
db.Query(“ select @a”)
返回null
那似乎是因为执行“ select @a”时,驱动器会在mysql服务器上创建一个新会话。 这导致会话变量无法使用。
数据库/ sql或github.com/go-sql-driver/mysql涉及的机制吗?
您提供的示例代码有两件事:
1) db.Query
返回rows
,必须将其关闭或完全读取(隐式关闭)。 否则,连接将被阻塞,并且不能再用于其他查询。
2)正如您已经猜到的那样,在大多数情况下,第二个db.Query会创建一个新会话,因为不能保证在同一连接上执行该会话。 当前,通过Go的数据库/ sql接口保留连接的唯一方法是使用事务: http :
我建议您阅读http://go-database-sql.org/上的数据库/ 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;
但是,并非所有语句都可以写入单个语句中。
作为
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()
它打印“混合”,这是全局值。
对于普通用户,它看起来像一个错误。
虽然是因为数据库/ sql,但是可以解决这种情况吗?
对arnehormann来说,“使用不带数据库/ sql的驱动程序”是什么意思? 不导入此程序包,构建失败
@tbdingqi不,并非所有内容都可以写成一个语句。 但是某些SET
问题可以通过这种方式解决。
对于普通用户来说,这似乎是一个错误:
我们无能为力,您无能为力。 我列出了这些东西。
如果可以做其他事情,我们会做或者尽快做。
请阅读与Julien链接的教程,它描述了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(...)
请注意,我在用trx而不是db进行查询。
我们可能需要在教程中给出更清晰的示例,以了解如何做
交易的“会话”,突出了这一点。 如果不是本教程
告诉您,请在提交错误
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(...)
请注意,我在用trx而不是db进行查询。
我们可能需要在教程中给出更清晰的示例,以了解如何做
交易的“会话”,突出了这一点。 如果不是本教程
告诉您,请在提交错误
https://github.com/VividCortex/go-database-sql-tutorial/issues