Mysql: "لا توجد قاعدة بيانات محددة" عندما تكون كلمة المرور فارغة

تم إنشاؤها على ٧ سبتمبر ٢٠١٨  ·  8تعليقات  ·  مصدر: go-sql-driver/mysql

وصف المشكلة

التنسيق الموصى به لـ DSN لمستخدم root و dbname db هو root@tcp(localhost:3306)/dbname .
عند تحديد هذا والسماح بتمكين كلمة مرور فارغة لـ mysql ، يشكو كل استعلام من no database selected .

بعد تمكين كلمة مرور الجذر لـ mysql ، قمت بإعادة تكوين DSN إلى root:password@tcp(localhost:3306)/dbname .
عملت الاستعلامات كما هو متوقع.

لقد أكدت أنه من الممكن الاتصال بـ mysql بدون كلمة مرور باستخدام https://github.com/ziutek/mymysql. نظرًا لعدم الاحتفاظ بهذا الريبو ولا يتماشى مع برامج تشغيل golang db ، سيكون من الأفضل لهذا المحرك دعم هذا السيناريو.

بينما تحتوي أنظمة الإنتاج على كلمة مرور ، فقد كلفني ذلك الكثير من الوقت عند تكوين خادم mysql محلي عبر عامل الإرساء.

مثال على الكود

يتطلب المثال التالي من المستخدم إنشاء قاعدة بيانات dbname وجدول organizations قبل التنفيذ.

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

ترتيب

نظام التشغيل: 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)

التعليق الأكثر فائدة

db.Exec("USE mydb")

يؤدي هذا فقط إلى تنفيذ "هذا الاستعلام على اتصال واحد في تجمع الاتصال *
تحتاج إلى إعادة إنشاء تجمع الاتصال (المعروف أيضًا باسم DB) ، باستخدام db الافتراضي في DSL.

ال 8 كومينتر

مرحبًا ، هذا التكوين هو نفسه بالنسبة لي ولكني أحصل على هذا الخطأ كيفية حله ؟؟

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

بدأت أواجه نفس المشكلة بمجرد أن قمت بالترقية إلى MySQL 8.

نسخة مكررة من # 825. استخدم الفرع الرئيسي لـ MySQL 8.0.

@ ميثان : لست متأكدًا مما إذا كان قد تم إصلاحه. تم إغلاق # 825 ، والذي ذكرته على أنه مكرر ، فأنا أستخدم آخر التزام في الفرع الرئيسي (حاليًا 6be42e0ff99645d7d9626d779001a46e39c5f280 ) ، كما اقترحت ، لكني أرى نفس الخطأ برمز مشابه . ملاحظة: أنا جديد تمامًا على Go وجديد جدًا لبرنامج تشغيل MySQL ، لذلك ربما أفعل شيئًا خاطئًا :).

  1. ابدأ MySQL: docker run -it --rm -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql

    • (علامة latest تساوي حاليًا 8.0.13 )

  2. نفذ الكود التالي:
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)
}

أحصل على المخرجات التالية:

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

أحيانًا يكون أحد goroutines الآخر ناجحًا ، في حين أن البقية لا تنجح ، لذا فإن هذا ليس حتميًا. لكنها دائمًا ما تنجح والباقي يفشل.

philippgille تحتاج إلى استخدام معاملة أو الحصول على اتصال واحد من المجمع. وإلا فإنه ليس من الآمن تنفيذ هذا الرمز ، حيث لا يوجد ضمان بأن يتم تنفيذ هذه العبارات بالتتابع على نفس الاتصال.

db.Exec("USE mydb")

يؤدي هذا فقط إلى تنفيذ "هذا الاستعلام على اتصال واحد في تجمع الاتصال *
تحتاج إلى إعادة إنشاء تجمع الاتصال (المعروف أيضًا باسم DB) ، باستخدام db الافتراضي في DSL.

لم أفهم تمامًا تعليق julienschmidt في البداية ، لكن شرحك ساعد في توضيح ذلكmethane. شكرا جزيلا على كل واحد منكم!

تم إصلاح هذا في 1.5.0 في اختباري ، قد يجرب الأشخاص الذين يواجهون هذه المشكلة مع 1.5.0.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات