El formato recomendado para DSN para root
usuario y dbname
db es root@tcp(localhost:3306)/dbname
.
Al especificar esto y permitir una contraseña vacía habilitada para mysql, cada consulta se queja con no database selected
.
Después de habilitar la contraseña de root para mysql, reconfiguré el DSN a root:password@tcp(localhost:3306)/dbname
.
Las consultas funcionaron como se esperaba.
Confirmé que es posible conectarse a mysql sin contraseña usando https://github.com/ziutek/mymysql. Como ese repositorio no se mantiene y no se alinea con los controladores golang db, sería mejor que este controlador admitiera este escenario.
Si bien los sistemas de producción tienen una contraseña, esto me costó mucho tiempo al configurar un servidor mysql local a través de la ventana acoplable.
El siguiente ejemplo requiere que el usuario cree una base de datos dbname
y una tabla organizations
antes de ejecutar.
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "root@/dbname")
if err != nil {
panic(err)
}
defer db.Close()
if err := db.Ping(); err != nil {
panic(err)
}
rows, err := db.Query("SELECT * FROM organizations")
if err != nil {
panic(err)
}
fmt.Println(rows, err)
defer rows.Close()
}
SO: Windows
go-sql-driver/ [email protected] (d523deb1b23d913de5bdada721a6071e71283618)
$ go version
go version go1.10.1 windows/amd64
$ docker run -it --rm mysql --version
/usr/sbin/mysqld Ver 8.0.12 for Linux on x86_64 (MySQL Community Server - GPL)
hola, esta configuración es la misma para mí, pero recibo este error, ¿cómo resolverlo?
2018/09/20 11:52:57 http: panic serving [::1]:50052: this authentication plugin is not supported
goroutine 6 [running]:
Empecé a tener este mismo problema tan pronto como actualicé a MySQL 8.
duplicado de #825. Use la rama maestra para MySQL 8.0.
@methane : no estoy seguro de si esto está solucionado. # 825 está cerrado, que mencionó como duplicado, estoy usando la última confirmación en la rama maestra (actualmente 6be42e0ff99645d7d9626d779001a46e39c5f280
), como sugirió, pero veo el mismo error con un código similar . Nota: soy bastante nuevo en Go y muy nuevo en este controlador MySQL, así que tal vez solo esté haciendo algo mal :).
docker run -it --rm -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
latest
actualmente equivale a 8.0.13
)package main
import (
"database/sql"
"fmt"
"strconv"
"time"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// Open connection
db, err := sql.Open("mysql", "root@/")
if err != nil {
panic(err)
}
// Test connection
err = db.Ping()
if err != nil {
panic(err)
}
// Create DB
_, err = db.Exec("CREATE DATABASE IF NOT EXISTS mydb")
if err != nil {
panic(err)
}
// Use DB
_, err = db.Exec("USE mydb")
if err != nil {
panic(err)
}
// Create table
_, err = db.Exec("CREATE TABLE IF NOT EXISTS mytable (k VARCHAR(255) PRIMARY KEY, v BLOB NOT NULL)")
if err != nil {
panic(err)
}
// Insert data concurrently
goroutineCount := 10
for i := 0; i < goroutineCount; i++ {
go func(i int) {
_, err = db.Exec("INSERT INTO mytable (k, v) VALUES (?, ?) ON DUPLICATE KEY UPDATE v = VALUES(v)", strconv.Itoa(i), []byte("some value"))
if err != nil {
fmt.Println(err)
} else {
fmt.Println("inserted value for key " + strconv.Itoa(i))
}
}(i)
}
// Wait a bit for all goroutines to finish.
time.Sleep(2 * time.Second)
}
Obtengo el siguiente resultado:
inserted value for key 1
Error 1046: No database selected
Error 1046: No database selected
Error 1046: No database selected
Error 1046: No database selected
Error 1046: No database selected
Error 1046: No database selected
Error 1046: No database selected
Error 1046: No database selected
Error 1046: No database selected
A veces, una de las otras gorutinas tiene éxito, mientras que el resto no, por lo que esto no es determinista. Pero siempre es uno que funciona y el resto que falla.
@philipppgille necesita usar una transacción u obtener una sola conexión del grupo. De lo contrario, no es seguro ejecutar este código, ya que no hay garantía de que estas declaraciones se ejecuten secuencialmente en la misma conexión.
db.Exec("USE mydb")
Esto simplemente ejecuta" esta consulta en una conexión en el *grupo de conexiones
Debe volver a crear el grupo de conexiones (también conocido como DB), con la base de datos predeterminada en DSL.
No entendí completamente el comentario de @julienschmidt al principio, pero tu explicación ayudó a aclarar @methane. ¡Muchas gracias a los dos!
Esto se solucionó en 1.5.0 en mi prueba, las personas que se encuentran con este problema pueden intentarlo con 1.5.0.
Comentario más útil
db.Exec("USE mydb")
Esto simplemente ejecuta" esta consulta en una conexión en el *grupo de conexiones
Debe volver a crear el grupo de conexiones (también conocido como DB), con la base de datos predeterminada en DSL.