Golang + MySQLで何かapiを作ろうと思って調べたら、たくさん情報が出てきたのでまとめてみる
基本設計
基本的な流れはこれに従う。
Golang+Echo+dbrでMySQLのCRUDをする/JSONでDBの値を返却する話
Echoの使い方は、以下を参照。
Go製のフレームワークechoを使ってJSONを返すWebサーバーを作り、GoogleAppEngineで動かす
Go の echo ってWebサーバーでサクッと REST しちゃう
Echo公式サイト
Fast and unfancy HTTP server framework for Go (Golang).
(気になったのでメモ。Echo公式サイトでは、carbon adsという、ヒートマップを計測するサービスを使っているらしい)
Golangの構造体で 「`」の記法について気になったので調べた
What are the use(s) for tags in Go?
どうやら、構造体のメタデータらしい。
GoangでMySQLを扱う方法についてまとめ
golangでSQLを叩くライブラリまとめ[基本/クエリビルダ/ORM]
Go database/sql tutorial
MySQLに接続するときの接続文字列について調べた。go-sql-driver/mysql
について調べると、案外早く見つかった
Golang Cafe #4 補足 データベースアクセス(MySQL編)
go-sql-driver/mysql でプレースホルダ置換をサポートしました
INT(11)の正体はこれで確認
MySQL(MariaDB) - 整数型の範囲!
MySQL "show users" - how to show/list the users in a MySQL database
-- 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;
-- 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 | 日付時刻型n桁。 | timestamp(n) | |
time | 時刻型。 | time | |
year | 年。2または4桁。 | year(n) | |
tinyblob | 8bit整数。 | tinyblob | |
blob | 8bit整数。 | blob | |
mediumblob | 8bit整数。 | mediumblob | |
longblob | 8bit整数。 | longblob | |
enum | 列挙型。 | enum('文字列1',文字列2'',...) | |
set | 文字列セット型。 | set('文字列1',文字列2'',...) | |
※ 引用: 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の整数型とは
整数型は以下の5種類
-
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を扱うときに一番使われているらしいライブラリ
作ったアプリのソースコード
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"))
}
$ curl localhost:1323
Hello, World!%
参考資料
- Golang+Echo+dbrでMySQLのCRUDをする/JSONでDBの値を返却する話
- Go製のフレームワークechoを使ってJSONを返すWebサーバーを作り、GoogleAppEngineで動かす
- Go の echo ってWebサーバーでサクッと REST しちゃう
- Fast and unfancy HTTP server framework for Go (Golang).
- carbon ads
- What are the use(s) for tags in Go?
- golangでSQLを叩くライブラリまとめ[基本/クエリビルダ/ORM]
- Go database/sql tutorial
- Golang Cafe #4 補足 データベースアクセス(MySQL編)
- go-sql-driver/mysql でプレースホルダ置換をサポートしました
- MySQL(MariaDB) - 整数型の範囲!
- MySQL "show users" - how to show/list the users in a MySQL database
- Go Relational Persistence