Mysql: 'no se seleccionó ninguna base de datos' cuando la contraseña está vacía

Creado en 7 sept. 2018  ·  8Comentarios  ·  Fuente: go-sql-driver/mysql

Descripcion del problema

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.

Código de ejemplo

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

Configuración

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)

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.

Todos 8 comentarios

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 :).

  1. Iniciar MySQL: docker run -it --rm -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql

    • (la etiqueta latest actualmente equivale a 8.0.13 )

  2. Ejecuta el siguiente código:
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.

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

Temas relacionados

PingGao89 picture PingGao89  ·  3Comentarios

xuewindy picture xuewindy  ·  3Comentarios

julienschmidt picture julienschmidt  ·  7Comentarios

zhaohui-kevin picture zhaohui-kevin  ·  5Comentarios

mayurshivakumar picture mayurshivakumar  ·  5Comentarios