Mysql: 会话变量不能使用?

创建于 2014-01-23  ·  7评论  ·  资料来源: go-sql-driver/mysql

如何重复
db.Query(“ set @ a = 1”)
db.Query(“ select @a”)

返回null

那似乎是因为执行“ select @a”时,驱动器会在mysql服务器上创建一个新会话。 这导致会话变量无法使用。

数据库/ 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(...)

请注意,我在用trx而不是db进行查询。

我们可能需要在教程中给出更清晰的示例,以了解如何做
交易的“会话”,突出了这一点。 如果不是本教程
告诉您,请在提交错误
https://github.com/VividCortex/go-database-sql-tutorial/issues

所有7条评论

您提供的示例代码有两件事:
1) db.Query返回rows ,必须将其关闭或完全读取(隐式关闭)。 否则,连接将被阻塞,并且不能再用于其他查询。
2)正如您已经猜到的那样,在大多数情况下,第二个db.Query会创建一个新会话,因为不能保证在同一连接上执行该会话。 当前,通过Go的数据库/ sql接口保留连接的唯一方法是使用事务: http :

我建议您阅读http://go-database-sql.org/上的数据库/ 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;

但是,并非所有语句都可以写入单个语句中。
作为

   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设置此变量?

此页面是否有帮助?
0 / 5 - 0 等级