Mysql: рдкрд╛рд╕рд╡рд░реНрдб рдЦрд╛рд▓реА рд╣реЛрдиреЗ рдкрд░ 'рдХреЛрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдирд╣реАрдВ рдЪреБрдирд╛ рдЧрдпрд╛'

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рд╕рд┐рддре░ 2018  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: go-sql-driver/mysql

рдореБрджреЗ рдХрд╛ рд╡рд┐рд╡рд░рдг

root рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ dbname db рдХреЗ рд▓рд┐рдП DSN рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рдкреНрд░рд╛рд░реВрдк root@tcp(localhost:3306)/dbname рд╣реИред
рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп рдФрд░ mysql рдХреЗ рд▓рд┐рдП рдЦрд╛рд▓реА рдкрд╛рд╕рд╡рд░реНрдб рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде, рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╡реЗрд░реА no database selected рдХреЗ рд╕рд╛рде рд╢рд┐рдХрд╛рдпрдд рдХрд░рддреА рд╣реИред

Mysql рдХреЗ рд▓рд┐рдП рд░реВрдЯ рдкрд╛рд╕рд╡рд░реНрдб рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ DSN рдХреЛ root:password@tcp(localhost:3306)/dbname рдореЗрдВ рдкреБрди: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ред
рдХреНрд╡реЗрд░реАрдЬрд╝ рдиреЗ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд┐рдпрд╛ред

рдореИрдВрдиреЗ рдкреБрд╖реНрдЯрд┐ рдХреА рдХрд┐ https://github.com/ziutek/mymysql рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛ mysql рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЪреВрдВрдХрд┐ рдЙрд╕ рд░реЗрдкреЛ рдХрд╛ рд░рдЦрд░рдЦрд╛рд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЧреЛрд▓рд╛рдВрдЧ рдбреАрдмреА рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

рдЬрдмрдХрд┐ рдЙрддреНрдкрд╛рджрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рд╣реЛрддрд╛ рд╣реИ, рдбреЛрдХрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдиреАрдп 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()
}

рд╡рд┐рдиреНрдпрд╛рд╕

рдУрдПрд╕: рд╡рд┐рдВрдбреЛрдЬрд╝
рдЧреЛ-рдПрд╕рдХреНрдпреВрдПрд▓-рдбреНрд░рд╛рдЗрд╡рд░/ [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")

рдпрд╣ рд╕рд┐рд░реНрдл рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ" рдЗрд╕ рдХреНрд╡реЗрд░реА рдХреЛ *рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдореЗрдВ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдкрд░
рдЖрдкрдХреЛ рдбреАрдПрд╕рдПрд▓ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбреАрдмреА рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ (рдЙрд░реНрдл рдбреАрдмреА) рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред

рд╕рднреА 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 ) рдкрд░ рдирд╡реАрдирддрдо рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдорд╛рди рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИред рдиреЛрдЯ: рдореИрдВ рдЧреЛ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдирдпрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ 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

рдХрднреА-рдХрднреА рдЕрдиреНрдп рдЧреЛрд░реЛрдЗрди рдореЗрдВ рд╕реЗ рдПрдХ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдмрд╛рдХреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд┐рдпрддрд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реИ рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╛рдХреА рдЬреЛ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

@philippgille рдЖрдкрдХреЛ рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпрд╛ рдкреВрд▓ рд╕реЗ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛ рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдмрд╛рдд рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрди рдХрдердиреЛрдВ рдХреЛ рдПрдХ рд╣реА рдХрдиреЗрдХреНрд╢рди рдкрд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

db.Exec("USE mydb")

рдпрд╣ рд╕рд┐рд░реНрдл рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ" рдЗрд╕ рдХреНрд╡реЗрд░реА рдХреЛ *рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдореЗрдВ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдкрд░
рдЖрдкрдХреЛ рдбреАрдПрд╕рдПрд▓ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбреАрдмреА рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ (рдЙрд░реНрдл рдбреАрдмреА) рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ @julienschmidt рдХреА рдЯрд┐рдкреНрдкрдгреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдиреЗ @рдорд┐рдереЗрди рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреАред рдЖрдк рджреЛрдиреЛрдВ рдХреЛ рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рдпрд╣ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ 1.5.0 рдореЗрдВ рддрдп рд╣реИ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ 1.5.0 рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jaysonShao picture jaysonShao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tanepiper picture tanepiper  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zhaohui-kevin picture zhaohui-kevin  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pedromorgan picture pedromorgan  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

knadh picture knadh  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ