Каков рекомендуемый способ подключения к MySQL от Go?

Я ищу надежное решение для подключения к базе данных MySQL из. Я видел некоторые библиотеки, но трудно определить различные состояния полноты и текущего обслуживания. У меня нет сложных потребностей, но я хотел бы знать, на что люди полагаются или какое самое стандартное решение для подключения к MySQL.

2 ответов


доступно несколько драйверов, но вы должны учитывать только те, которые реализуют база данных / sql API as

  • обеспечивает чистый и эффективный синтаксис
  • это гарантирует, что вы можете позже изменить драйвер без изменения кода, кроме импорта и подключения.

два быстрых и надежных драйвера доступны для MySQL :

я использовал оба из них в производстве, программы работают в течение нескольких месяцев с номерами соединений в миллионах без сбоев.

другие драйверы базы данных SQL перечислены на go-wiki.

импорт при использовании MyMySQL:

import (
    "database/sql"
    _ "github.com/ziutek/mymysql/godrv"
)

импорт при использовании Go-MySQL-Driver :

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

подключение и закрытие с помощью MyMySQL:

con, err := sql.Open("mymysql", database+"/"+user+"/"+password)
defer con.Close()
// here you can use the connection, it will be closed when function returns

подключение и закрытие с помощью Go-MySQL-Driver:

con, err := sql.Open("mysql", store.user+":"+store.password+"@/"+store.database)
defer con.Close()

выбираем одну строку :

row := con.QueryRow("select mdpr, x, y, z from sometable where id=?", id)
cb := new(SomeThing)
err := row.Scan(&cb.Mdpr, &cb.X, &cb.Y, &cb.Z)

выберите несколько строк и создайте массив с результатами:

rows, err := con.Query("select a, b from item where p1=? and p2=?", p1, p2)
if err != nil { /* error handling */}
items := make([]*SomeStruct, 0, 10)
var ida, idb uint
for rows.Next() {
    err = rows.Scan(&ida, &idb)
    if err != nil { /* error handling */}
    items = append(items, &SomeStruct{ida, idb})
}

вставить :

_, err = con.Exec("insert into tbl (id, mdpr, isok) values (?, ?, 1)", id, mdpr)

вы увидите, что работа в Go с MySQL восхитительна опыт работы: I никогда была проблема, мои серверы работают в течение нескольких месяцев без ошибок или утечек. Тот факт, что большинство функций просто принимают переменное число аргументов, облегчает задачу, которая утомительна во многих языках.

обратите внимание, что если в будущем вам нужно использовать другой драйвер MySQL, вам просто нужно будет изменить две строки в одном файле go : строка, выполняющая импорт, и строка, открывающая соединение.


несколько вещей, чтобы принять к сведению пример строки select 1:

row := con.QueryRow("select mdpr, x, y, z from sometable where id=?",id) 
cb := new(SomeThing) 
err := row.Scan(&cb.Mdpr, &cb.X, &cb.Y, &cb.Z)

отсутствует row.Next() в этом примере. его нужно назвать row.Next() чтобы захватить первую возвращенную строку.

также существует некоторая негибкость библиотеки, которая каким-то образом пытается способствовать минимализму данных. если вы попытаетесь выбрать столбцы, которые не сканируются, он выдаст ошибки (а не только предупреждения)