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

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

Ответ 1

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

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

Для 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 - это восхитительный опыт: у меня никогда возникла проблема, мои серверы работают в течение нескольких месяцев без ошибок или утечек. Тот факт, что большинство функций просто принимает переменное количество аргументов, облегчает задачу, которая утомительна на многих языках.

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

Ответ 2

несколько вещей, чтобы принять к сведению пример 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().

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