Mysql: las variables de sesión no se pueden utilizar?

Creado en 23 ene. 2014  ·  7Comentarios  ·  Fuente: go-sql-driver/mysql

como repetir
db.Query ("establecer @ a = 1")
db.Query ("seleccionar @a")

devolver nulo

Eso parece porque cuando se ejecutó "select @a", la unidad crea una nueva sesión en el servidor mysql. Esto lleva a que las variables de sesión no se puedan utilizar.

¿El mecanismo involucrado por database / sql o github.com/go-sql-driver/mysql?

databassql issue question

Comentario más útil

En su código de muestra que imprimió el formato binlog, escribió

trx,: = db.Begin ()
db.Query ("establecer binlogformat = fila")
filas, _: = db.Query ("seleccionar @@ binlog_format")

No puede acceder a la variable db allí; necesitas hacer esto en su lugar:

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

Tenga en cuenta que estoy consultando con trx, no con db.

Es posible que necesitemos dar ejemplos más claros en el tutorial sobre cómo hacer
"sesiones" con transacciones, destacando esto. Si el tutorial no es
claro para usted, por favor presente un error en
https://github.com/VividCortex/go-database-sql-tutorial/issues

Todos 7 comentarios

Hay dos cosas mal con el código de ejemplo proporcionado:
1) db.Query devuelve rows que debe cerrarse o leerse por completo (lo que implícitamente lo cierra). De lo contrario, la conexión se bloquea y no se puede reutilizar para otras consultas.
2) Como ya adivinó, la segunda db.Query crea una nueva sesión en la mayoría de los casos, ya que no se garantiza que se ejecute en la misma conexión. Actualmente, la única forma de reservar una conexión a través de la interfaz de base de datos / sql de Go es usar transacciones: http://golang.org/pkg/database/sql/#DB.Begin

Le recomiendo que lea el tutorial de base de datos / sql en http://go-database-sql.org/

Puede crear una nueva sesión, puede usar la misma. No lo sabemos, depende completamente de la agrupación por database/sql y no hay nada que podamos hacer para cambiarlo.

Usted puede

  • Presentar un problema para agregar soporte de sesión a Go y esperar que se agregue rápidamente
  • hágalo en una transacción (que usa la misma conexión para todas las consultas)
  • usar el controlador sin database/sql
  • usar inseguro para extraer la conexión
  • reescriba sus consultas para que las variables se inicialicen en SELECT

Mi receta para el último:

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

se convierte en

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;

Pero no todas las declaraciones se pueden escribir en una sola declaración.
como

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

Imprime "mixto", que es el valor global.

Para el usuario de comman, parece un error.
Aunque se debe a la base de datos / sql, ¿se puede hacer algo para tratar este caso?

para arnehormann, ¿qué quiere decir con "usar el controlador sin base de datos / sql"? Sin importar este paquete, build faild

@tbdingqi No, no todo se puede escribir en una sola declaración. Pero algunos de los problemas de SET pueden resolverse de esa manera.

Parece un error para un usuario común:
No hay nada que podamos hacer y tú puedes hacer algo. Hice una lista de esas cosas.
Si se pudiera hacer algo más, lo habríamos hecho o lo haríamos tan pronto como pudiéramos.
Por favor, lea el tutorial al que está vinculado Julien, describe las limitaciones de la API bastante bien.

La importación: puede usar import "github.com/go-sql-driver/mysql" lugar de

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

y hablar con el conductor directamente sin database/sql .

En su código de muestra que imprimió el formato binlog, escribió

trx,: = db.Begin ()
db.Query ("establecer binlogformat = fila")
filas, _: = db.Query ("seleccionar @@ binlog_format")

No puede acceder a la variable db allí; necesitas hacer esto en su lugar:

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

Tenga en cuenta que estoy consultando con trx, no con db.

Es posible que necesitemos dar ejemplos más claros en el tutorial sobre cómo hacer
"sesiones" con transacciones, destacando esto. Si el tutorial no es
claro para usted, por favor presente un error en
https://github.com/VividCortex/go-database-sql-tutorial/issues

@xaprb buena captura, me perdí el mal uso de Tx.

Este método no funcionará para variables como sql_log_bin .
Mysql en sí da un error:
ERROR 1694 (HY000): Cannot modify @@session.sql_log_bin inside a transaction

¿Existe la posibilidad de configurar esta variable para *sql.DB ?

¿Fue útil esta página
0 / 5 - 0 calificaciones