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.
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()
}
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)
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 :) .
docker run -it --rm -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
latest
est actuellement égale 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)
}
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.
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.