Mysql: 'tidak ada basis data yang dipilih' ketika kata sandi kosong

Dibuat pada 7 Sep 2018  ·  8Komentar  ·  Sumber: go-sql-driver/mysql

Deskripsi masalah

Format yang disarankan untuk DSN untuk pengguna root dan dbname db adalah root@tcp(localhost:3306)/dbname .
Saat menentukan ini dan dengan mengizinkan kata sandi kosong diaktifkan untuk mysql, setiap kueri mengeluh dengan no database selected .

Setelah mengaktifkan kata sandi root untuk mysql, saya mengkonfigurasi ulang DSN menjadi root:password@tcp(localhost:3306)/dbname .
Kueri berfungsi seperti yang diharapkan.

Saya mengonfirmasi bahwa dimungkinkan untuk terhubung ke mysql tanpa kata sandi menggunakan https://github.com/ziutek/mymysql. Karena repo itu tidak dipertahankan dan tidak selaras dengan driver golang db, akan lebih baik jika driver ini mendukung skenario ini.

Sementara sistem produksi memiliki kata sandi, ini menghabiskan banyak waktu ketika mengonfigurasi server mysql lokal melalui buruh pelabuhan.

Contoh kode

Contoh berikut mengharuskan pengguna untuk membuat database dbname dan tabel organizations sebelum dieksekusi.

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

Konfigurasi

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

Komentar yang paling membantu

db.Exec("USE mydb")

Ini hanya mengeksekusi" kueri ini pada satu koneksi di *kolam koneksi
Anda perlu membuat ulang kumpulan koneksi (alias DB), dengan db default di DSL.

Semua 8 komentar

hai konfigurasi ini sama untuk saya tetapi saya mendapatkan Kesalahan ini bagaimana menyelesaikannya ??

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

Saya mulai mengalami masalah yang sama segera setelah saya memutakhirkan ke MySQL 8.

duplikat #825. Gunakan cabang master untuk MySQL 8.0.

@methane : Saya tidak yakin apakah ini sudah diperbaiki. #825 ditutup, yang Anda sebutkan sebagai duplikat, saya menggunakan komit terbaru di cabang master (saat ini 6be42e0ff99645d7d9626d779001a46e39c5f280 ), seperti yang Anda sarankan, tetapi saya melihat kesalahan yang sama dengan kode serupa . Catatan: Saya cukup baru dalam Go dan sangat baru dalam driver MySQL ini, jadi mungkin saya hanya melakukan sesuatu yang salah :) .

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

    • ( latest tag saat ini sama dengan 8.0.13 )

  2. Jalankan kode berikut:
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)
}

Saya mendapatkan output berikut:

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

Terkadang salah satu goroutine lain berhasil, sedangkan yang lainnya tidak, jadi ini tidak deterministik. Tapi selalu salah satu yang berhasil dan sisanya yang gagal.

@philippgille Anda perlu menggunakan transaksi atau mendapatkan satu koneksi dari kumpulan. Jika tidak, tidak aman untuk mengeksekusi kode ini, karena tidak ada jaminan bahwa pernyataan ini dieksekusi secara berurutan pada koneksi yang sama.

db.Exec("USE mydb")

Ini hanya mengeksekusi" kueri ini pada satu koneksi di *kolam koneksi
Anda perlu membuat ulang kumpulan koneksi (alias DB), dengan db default di DSL.

Saya tidak sepenuhnya memahami komentar @julienschmidt pada awalnya, tetapi penjelasan Anda membantu memperjelas @methane. Terima kasih banyak untuk kalian berdua!

Ini diperbaiki di 1.5.0 dalam pengujian saya, orang yang mengalami masalah ini dapat mencoba dengan 1.5.0.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat