From 2953fd2a4359e04909ab087a63d3da999a912b29 Mon Sep 17 00:00:00 2001 From: kasmanavt Date: Wed, 21 Dec 2016 00:26:25 +0300 Subject: [PATCH] Add 5.2 --- ru/05.2.md | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 ru/05.2.md diff --git a/ru/05.2.md b/ru/05.2.md new file mode 100644 index 00000000..7da9a34e --- /dev/null +++ b/ru/05.2.md @@ -0,0 +1,129 @@ +# 5.2 MySQL + +Комплекс северного программного обеспечения LAMP последние годы очень популярен в интернете. Буква М в данном акрониме означает MySQL. MySQL является наиболее известной базой данных с открытым исходным кодом. Она проста в использовании, поэтому ее часто используют в бэкенде множества веб-сайтов. + +## Драйвера MySQL + +Есть несколько драйверов, которые поддерживают MySQL в Go, некоторые из них включают `database/sql`, некоторые используют только стандарты интерфейсов. + +- [https://github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql) поддерживает `database/sql`, чистый код Go. +- [https://github.com/ziutek/mymysql](https://github.com/ziutek/mymysql) поддерживает `database/sql` и определенные пользователем интерфейсы, чистый код Go. +- [https://github.com/Philio/GoMySQL](https://github.com/Philio/GoMySQL) поддерживает только определенные пользователем интерфейсы, чистый код Go. + +Я буду использовать первый драйвер в моих будущих примерах (в моих проекта я тоже использую его). Я рекомендую вам использовать его по следующим причинам: + +- Это новый драйвер базы данных и он предоставляет множество возможностей. +- Полностью поддерживает стандарты интерфейса `databse/sql`. +- Поддерживает постоянное соединение между потоками. + +##Примеры + +Во всех следующих разделах я буду использовать одинаковую структуру таблицы базы данных для различных баз данных, создать которую можно следующим SQL запросом: + + CREATE TABLE `userinfo` ( + `uid` INT(10) NOT NULL AUTO_INCREMENT, + `username` VARCHAR(64) NULL DEFAULT NULL, + `departname` VARCHAR(64) NULL DEFAULT NULL, + `created` DATE NULL DEFAULT NULL, + PRIMARY KEY (`uid`) + ); + +В следующем примере показано, как работать с базой данных на основе стандартов интерфейса `database/sql`. + + package main + + import ( + "database/sql" + "fmt" + + _ "github.com/go-sql-driver/mysql" + ) + + func main() { + db, err := sql.Open("mysql", "astaxie:astaxie@/test?charset=utf8") + checkErr(err) + + // вставка + stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?") + checkErr(err) + + res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09") + checkErr(err) + + id, err := res.LastInsertId() + checkErr(err) + + fmt.Println(id) + // обновление + stmt, err = db.Prepare("update userinfo set username=? where uid=?") + checkErr(err) + + res, err = stmt.Exec("astaxieupdate", id) + checkErr(err) + + affect, err := res.RowsAffected() + checkErr(err) + + fmt.Println(affect) + + // запрос + rows, err := db.Query("SELECT * FROM userinfo") + checkErr(err) + + for rows.Next() { + var uid int + var username string + var department string + var created string + err = rows.Scan(&uid, &username, &department, &created) + checkErr(err) + fmt.Println(uid) + fmt.Println(username) + fmt.Println(department) + fmt.Println(created) + } + + // удаление + stmt, err = db.Prepare("delete from userinfo where uid=?") + checkErr(err) + + res, err = stmt.Exec(id) + checkErr(err) + + affect, err = res.RowsAffected() + checkErr(err) + + fmt.Println(affect) + + db.Close() + + } + + func checkErr(err error) { + if err != nil { + panic(err) + } + } + +Позвольте мне объяснить несколько важных функций: + +- `sql.Open()` - открывает зарегистрированный драйвер базы данных. В нашем примере это Go-MySQL-Driver. Второй аргумент в данной функции это DSN (Data Source Name), который определяет набор информации, необходимой для подключения к базе данных. Он поддерживает следующие форматы: + + User@UNIX(/path/to/socket)/dbname? charset = utf8 + user:password@tcp(localhost:5555)/dbname?charset=utf8 + user:password@/dbname + user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname + +- `db.Prepare()` - возвращает SQL операцию, которая будет выполнятся, так же возвращает статус исполнения после исполнения SQL запроса. +- `db.Query()` - исполняет SQL и возвращает результат в виде набора строк. +- `stmt.Exec()` - выполняет SQL, который подготовлен в Stmt. + +Обратите внимание, что мы используем формат «=?» для передачи аргументов. Это делается для предотвращения SQL-инъекций. + +## Ссылки + +- [Содержание](preface.md) +- Предыдущий раздел: [Интерфейс database/sql](05.1.md) +- Следующий раздел: [SQLite](05.3.md) + +