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


163

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

Відповіді:


263

Доступно декілька драйверів, але слід розглянути лише ті, що реалізують API бази даних / sql як

  • це забезпечує чистий та ефективний синтаксис,
  • це гарантує згодом ви можете змінити драйвер, не змінюючи код, крім імпорту та з'єднання.

Для MySQL доступні два швидких та надійних драйвера:

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

Інші драйвери баз даних SQL перелічені на go-wiki .

Імпорт при використанні MyMySQL:

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

Імпорт при використанні Go-MySQL-драйвера:

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-драйвера:

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
Дякую тобі, я спробую. Мені подобається, що Go надає пакет бази даних / sql, який бібліотеки можуть реалізувати.
Сергі Мансілла

9
Відмінна ґрунтовка для новачків. Дякую.
Рік-777

5
Список перевірених драйверів (також для інших СУБД) доступний за адресою code.google.com/p/go-wiki/wiki/SQLDrivers Є другий популярний драйвер MySQL: github.com/Go-SQL-Driver/MySQL (написано мною)
Жульєн Шмідт

1
@JulienSchmidt Я відредагував свою відповідь, щоб послатись на ваше посилання. Якщо у вас є посилання на порівняння між цими двома драйверами, було б раді.
Denys Séguret

1
@Zeynel Це лише приклад (взято з цього особистого проекту ). Я відредагував заміну на SomeThing. Суть цього рядка полягає в тому, щоб показати, як безпосередньо заповнити структуру результатом вашого запиту без проміжних змінних.
Denys Séguret

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()щоб схопити перший рядок, що повернувся.

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


2
Це не точно: функція QueryRow повертає * Рядок. Ця функція стверджує, що запит повертає один рядок. Запит () повертає (* Рядки, помилка), для чого потрібен дзвінок до рядків.Наступний ().
Alan LaMielle
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.