Golang + Echo + MySQL まとめ

Golang + MySQLで何かapiを作ろうと思って調べたら、たくさん情報が出てきたのでまとめてみる

基本設計
-----

基本的な流れはこれに従う。
[Golang+Echo+dbrでMySQLのCRUDをする／JSONでDBの値を返却する話](http://qiita.com/CST_negi/items/5e276ddc0412cefef7e3)

Echoの使い方は、以下を参照。
[Go製のフレームワークechoを使ってJSONを返すWebサーバーを作り、GoogleAppEngineで動かす](http://qiita.com/qube81/items/701279c43b33ce923613)
[Go の echo ってWebサーバーでサクッと REST しちゃう](http://qiita.com/keika299/items/62e806ae42828bb3567a)

Echo公式サイト
[Fast and unfancy HTTP server framework for Go (Golang).](https://echo.labstack.com/)

(気になったのでメモ。Echo公式サイトでは、[carbon ads](https://carbonads.net/)という、ヒートマップを計測するサービスを使っているらしい)

Golangの構造体で 「｀」の記法について気になったので調べた
-----

[What are the use(s) for tags in Go?](http://stackoverflow.com/questions/10858787/what-are-the-uses-for-tags-in-go)

どうやら、構造体のメタデータらしい。

GoangでMySQLを扱う方法についてまとめ
-----

[golangでSQLを叩くライブラリまとめ[基本/クエリビルダ/ORM]](http://qiita.com/umisama/items/c022b16101c48ffdbc6a)
[Go database/sql tutorial](http://go-database-sql.org/index.html)


MySQLに接続するときの接続文字列について調べた。`go-sql-driver/mysql`について調べると、案外早く見つかった
[Golang Cafe #4 補足 データベースアクセス（MySQL編）](http://d.hatena.ne.jp/taknb2nch/20131127/1385532940)
[go-sql-driver/mysql でプレースホルダ置換をサポートしました](http://dsas.blog.klab.org/archives/52191467.html)

INT(11)の正体はこれで確認
[MySQL(MariaDB) - 整数型の範囲！](http://www.mk-mode.com/octopress/2014/02/04/mysql-type-of-integer/)

[MySQL "show users" - how to show/list the users in a MySQL database](http://alvinalexander.com/blog/post/mysql/show-users-i-ve-created-in-mysql-database)



```sql
-- DB作成
CREATE DATABASE IF NOT EXISTS db_name;

-- ユーザー作成
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT,UPDATE,INSERT,DELETE ON 'db_name'.* TO 'username'@'localhost';
FLUSH PRIVILEGES;

-- テーブル作成
CREATE TABLE db_name.table_name (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL
);


-- ユーティリティー系
-- MySQLユーザー一覧の確認
SELECT User,Host FROM mysql.user;
-- データベース一覧
SHOW DATABASES;
-- データベース詳細情報一覧
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA;
-- データベース作成時のSQL文を表示
SHOW CREATE DATABASE db_name;
-- テーブル一覧
SHOW TABLES FROM db_name;
-- テーブルの構造を表示
DESC db_name.table_name;
```

```sql
-- APPデータベース定義
CREATE TABLE counters (
  id INT NOT NULL AUTO_INCREMENT,
  host_id INT NOT NULL,
  path varchar(2047) NOT NULL DEFAULT '/',
  count INT NOT NULL,
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL,
  PRIMARY KEY (id)
);
ALTER TABLE counters ADD INDEX index_host_id_and_path(host_id, path(255));

CREATE TABLE hosts (
  id INT NOT NULL AUTO_INCREMENT,
  host_name varchar(255) NOT NULL,
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL,
  PRIMARY KEY (id)
);
ALTER TABLE hosts ADD INDEX index_id(id);
```

MySQL型一覧
-----

| 型 | 説明 | 指定形式 | 別名 |
|-----|-----|-----|-----|
| tinyint | 8bit整数。 | tinyint(n) [unsigned] [zerofill] |
| smallint | 16bit整数。 | smallint(n) [unsigned] [zerofill] |
| mediumint | 24bit整数。 | mediumint(n) [unsigned] [zerofill] |
| **int** | 32bit整数。 | int(n) [unsigned] [zerofill] | integer |
| bigint | 64bit整数。 | bigint(n) [unsigned] [zerofill] |
| decimal | パック10進数。 | decimal(n, d) [zerofill] | dec,numeric |
| **float** | 浮動小数点数。4または8バイト。 | tinyint(n) [zerofill] |
| double | 浮動小数点数。 | double(n) [zerofill] |
| double precision | 倍精度浮動小数点数。 | double precision(n) [zerofill] | real |
| char | 固定長文字列型。 | char(n) [binary] |
| **varchar** | 可変長文字列型。 | varchar(n) [binary] |
| tinytext | 可変長文字列型。255バイト以下。 | tinytext |
| text | 可変長文字列型。65535バイト以下。 | text |
| mediumtext | 可変長文字列型。1677215バイト以下。 | mediumtext |
| longtext | 可変長文字列型。4294967295バイト以下。 | longtext |
| date | 日付型。 | date |
| **datetime** | 日付時刻型。 | datetime |
| **timestamp** | 日付時刻型ｎ桁。 | timestamp(n) |
| time | 時刻型。 | time |
| year | 年。２または４桁。 | year(n) |
| tinyblob | 8bit整数。 | tinyblob |
| blob | 8bit整数。 | blob |
| mediumblob | 8bit整数。 | mediumblob |
| longblob | 8bit整数。 | longblob |
| enum | 列挙型。 | enum('文字列１',文字列２'',...) |
| set | 文字列セット型。 | set('文字列１',文字列２'',...) |
※ 引用: http://www.k-cube.co.jp/wakaba/server/mysql_type.html

MySQL主な列フラグ
-----

| 列フラグ | 概要 |
|-----|-----|
| AUTO_INCREMENT | 自動連番(データ型は整数型※1) |
| DEFAULT 'デフォルト値' | 値が未指定の場合のデフォルト値 |
| [NOT] NULL | NULLを許容する\[しない\] (デフォルトはNULL) |
| PRIMARY KEY | 重複する値を許さない (NULL値は不可) |
| UNIQUE | 重複する値を許さない (NULL値を許可) |
| REFERENCES テーブル名(列名, ....) | 外部参照制約 |

MYSQL主なオプション
-----

| オプション| 概要 |
|-----|-----|
| PRIMARY KEY (列名, ....) | 主キーを設定 |
| INDEX インデックス名 (列名, ....) | インデックスを作成(NULL値は不可) |
| UNIQUE インデックス名 (列名, ....) | 重複した値をゆるさない(NULL値は不可) |
| FOREIGN KEY (列名) REFERENCES テーブル名 (列名, ....) | 外部参照制約 |
 
MySQLの整数型とは
-----

整数型は以下の５種類

* TINYINT
  -128から127 (符号無しの場合0から255)

* SMALLINT
  -32768から32767 (符号無しの場合0から65535)

* MEDIUMINT
  -8388608から8388607 (符号無しの場合0から16777215)

* INT
  -2147483648から2147483647 (符号無しの場合0から4294967295)
  別名：INTEGER

* BIGINT
  -9223372036854775808から9223372036854775807
  (符号無しの場合0から18446744073709551615)

※ 引用: http://www.dbonline.jp/mysql/type/index1.html

GolangでMySQLを扱うときに一番使われているらしいライブラリ
-----

[Go Relational Persistence](https://github.com/go-gorp/gorp)

作ったアプリのソースコード
-----

```go
package main

import (
    "net/http"
    "github.com/labstack/echo"
    "github.com/labstack/echo/engine/standard"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })
    e.Run(standard.New(":1323"))
}
```

```bash
$ curl localhost:1323
Hello, World!%
```

参考資料
-----

* [Golang+Echo+dbrでMySQLのCRUDをする／JSONでDBの値を返却する話](http://qiita.com/CST_negi/items/5e276ddc0412cefef7e3)
* [Go製のフレームワークechoを使ってJSONを返すWebサーバーを作り、GoogleAppEngineで動かす](http://qiita.com/qube81/items/701279c43b33ce923613)
* [Go の echo ってWebサーバーでサクッと REST しちゃう](http://qiita.com/keika299/items/62e806ae42828bb3567a)
* [Fast and unfancy HTTP server framework for Go (Golang).](https://echo.labstack.com/)
* [carbon ads](https://carbonads.net/)
* [What are the use(s) for tags in Go?](http://stackoverflow.com/questions/10858787/what-are-the-uses-for-tags-in-go)
* [golangでSQLを叩くライブラリまとめ[基本/クエリビルダ/ORM]](http://qiita.com/umisama/items/c022b16101c48ffdbc6a)
* [Go database/sql tutorial](http://go-database-sql.org/index.html)
* [Golang Cafe #4 補足 データベースアクセス（MySQL編）](http://d.hatena.ne.jp/taknb2nch/20131127/1385532940)
* [go-sql-driver/mysql でプレースホルダ置換をサポートしました](http://dsas.blog.klab.org/archives/52191467.html)
* [MySQL(MariaDB) - 整数型の範囲！](http://www.mk-mode.com/octopress/2014/02/04/mysql-type-of-integer/)
* [MySQL "show users" - how to show/list the users in a MySQL database](http://alvinalexander.com/blog/post/mysql/show-users-i-ve-created-in-mysql-database)
* [Go Relational Persistence](https://github.com/go-gorp/gorp)