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?
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
database/sql
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
?
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