Mysql: 'aucune base de données sélectionnée' lorsque le mot de passe est vide

Créé le 7 sept. 2018  ·  8Commentaires  ·  Source: go-sql-driver/mysql

Description du problème

Le format recommandé pour DSN pour root user et dbname db est root@tcp(localhost:3306)/dbname .
Lorsque vous spécifiez ceci et avec allow empty password activé pour mysql, chaque requête se plaint avec no database selected .

Après avoir activé le mot de passe root pour mysql, j'ai reconfiguré le DSN en root:password@tcp(localhost:3306)/dbname .
Les requêtes ont fonctionné comme prévu.

J'ai confirmé qu'il est possible de se connecter à mysql sans mot de passe en utilisant https://github.com/ziutek/mymysql. Comme ce référentiel n'est pas maintenu et ne s'aligne pas sur les pilotes golang db, il serait préférable que ce pilote prenne en charge ce scénario.

Alors que les systèmes de production ont un mot de passe, cela m'a coûté beaucoup de temps lors de la configuration d'un serveur mysql local via docker.

Exemple de code

L'exemple suivant demande à l'utilisateur de créer une base de données dbname et une table organizations avant l'exécution.

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

Configuration

Système d'exploitation : 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)

Commentaire le plus utile

db.Exec("USE mydb")

Cela exécute simplement" cette requête sur une connexion dans le * pool de connexions
Vous devez recréer le pool de connexions (alias DB), avec la base de données par défaut dans DSL.

Tous les 8 commentaires

salut cette configuration est la même pour moi mais je reçois cette erreur comment la résoudre ??

2018/09/20 11:52:57 http: panic serving [::1]:50052: this authentication plugin is not supported
goroutine 6 [running]:

J'ai commencé à avoir ce même problème dès que j'ai mis à niveau vers MySQL 8.

duplicata de #825. Utilisez la branche master pour MySQL 8.0.

@methane : Je ne sais pas si c'est corrigé. # 825 est fermé, que vous avez mentionné comme doublon, j'utilise le dernier commit sur la branche principale (actuellement 6be42e0ff99645d7d9626d779001a46e39c5f280 ), comme vous l'avez suggéré, mais je vois la même erreur avec un code similaire . Remarque : je suis assez nouveau sur Go et très nouveau sur ce pilote MySQL, alors peut-être que je fais juste quelque chose de mal :) .

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

    • ( La balise latest est actuellement égale 8.0.13 )

  2. Exécutez le code suivant :
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)
}

J'obtiens la sortie suivante :

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

Parfois, l'une des autres goroutines réussit, tandis que les autres ne le sont pas, donc ce n'est pas déterministe. Mais c'est toujours celui qui marche et le reste qui échoue.

@philippgille vous devez utiliser une transaction ou obtenir une seule connexion à partir du pool. Sinon, il n'est pas sûr d'exécuter ce code, car il n'y a aucune garantie que ces instructions soient exécutées séquentiellement sur la même connexion.

db.Exec("USE mydb")

Cela exécute simplement" cette requête sur une connexion dans le * pool de connexions
Vous devez recréer le pool de connexions (alias DB), avec la base de données par défaut dans DSL.

Je n'ai pas tout à fait compris le commentaire de @julienschmidt au début, mais votre explication a aidé à clarifier @methane. Merci beaucoup à vous deux !

Ceci est corrigé dans 1.5.0 dans mon test, les personnes rencontrant ce problème peuvent essayer avec 1.5.0.

Cette page vous a été utile?
0 / 5 - 0 notes