Goで一通りのsql操作をやってみる

この記事は[tomowarkar ひとりAdvent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)の18日目の記事です。

# はじめに
Goでのmysql操作を備忘録としてまとめてみた
# コード全文

<details><summary>コード全文</summary><div>

```go
package main

import (
	"database/sql"
	"fmt"
	"log"

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

const appname = "gopherbot"

func run() (*sql.DB, error) {
	dbDriver := "mysql"
	dbUser := "root"
	dbPass := "password"
	dbName := ""
	db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName)
	if err != nil {
		return nil, err
	}
	defer db.Close()

	res, _ := db.Query("SHOW DATABASES")
	var database string

	for res.Next() {
		res.Scan(&database)
		fmt.Println(database)
	}
	fmt.Println()

	_, err = db.Exec("CREATE DATABASE IF NOT EXISTS " + appname)
	if err != nil {
		return nil, err
	}

	res, _ = db.Query("SHOW DATABASES")

	for res.Next() {
		res.Scan(&database)
		fmt.Println(database)
	}
	fmt.Println()

	_, err = db.Exec("USE " + appname)
	if err != nil {
		return nil, err
	}

	res, _ = db.Query("SHOW TABLES")
	var table string
	for res.Next() {
		res.Scan(&table)
		fmt.Println(table)
	}
	fmt.Println()

	_, err = db.Exec("CREATE TABLE IF NOT EXISTS example ( id integer, name varchar(32) )")
	if err != nil {
		return nil, err
	}

	ins, err := db.Prepare("INSERT INTO example(id,name) VALUES(?,?)")
	if err != nil {
		return nil, err
	}
	ins.Exec(1, "hoge")
	ins.Exec(3, "huga")

	res, _ = db.Query("SELECT *  FROM example")
	for res.Next() {
		var id int
		var name string
		res.Scan(&id, &name)
		fmt.Println(id, name)
	}
	fmt.Println()

	_, err = db.Exec("DROP DATABASE " + appname)
	if err != nil {
		return nil, err
	}

	return db, nil
}

func main() {
	_, err := run()
	if err != nil {
		log.Fatal(err)
	}
}
```

```bash:output
mysql

gopherbot
mysql

1 hoge
3 huga

```

</div></details>

# データベース接続, 切断
```go
dbDriver := "mysql"
dbUser := "root"
dbPass := "password"
dbName := ""
db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName)
if err != nil {
	log.Fatal(err)
}
defer db.Close()
```
# データベース表示(SHOW DATABASES)
```go
res, _ := db.Query("SHOW DATABASES")
var database string
for res.Next() {
	res.Scan(&database)
	fmt.Println(database)
}
```

# データベース作成(CREATE DATABASE)
```go
_, err = db.Exec("CREATE DATABASE IF NOT EXISTS " + yourDatabsase)
if err != nil {
	log.Fatal(err)
}
```

# データベース選択(USE)
```go
_, err = db.Exec("USE " + yourDatabsase)
if err != nil {
	log.Fatal(err)
}
```
# テーブル表示(SHOW TABLES)
```go
res, _ = db.Query("SHOW TABLES")
var table string
for res.Next() {
	res.Scan(&table)
	fmt.Println(table)
}
```
# テーブル作成(CREATE TABLE)
```go
_, err = db.Exec("CREATE TABLE IF NOT EXISTS " + yourTable + " ( id integer, name varchar(32) )")
if err != nil {
	log.Fatal(err)
}
```
# データ挿入(INSERT)
```go
ins, err := db.Prepare("INSERT INTO " + yourTable + "(id,name) VALUES(?,?)")
if err != nil {
	log.Fatal(err)
}
ins.Exec(1, "hoge")
ins.Exec(3, "huga")
```

# データ表示(SELECT)
```go
res, _ = db.Query("SELECT *  FROM " + yourTable)
for res.Next() {
	var id int
	var name string
	res.Scan(&id, &name)
	fmt.Println(id, name)
}
```

# データベース削除(DROP DATABASE)
```go
_, err = db.Exec("DROP DATABASE " + yourDatabsase)
if err != nil {
	log.Fatal(err)
}
```

# おわりに
以上明日も頑張ります！！
[tomowarkar ひとりAdvent Calendar Advent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)


# 参考
https://qiita.com/merrill/items/967884c02e10bd8f32f5
https://medium.com/@udayakumarvdm/create-mysql-database-using-golang-b28c08e54660
https://flaviocopes.com/golang-sql-database/