golangのお勉強6




## PostgreSQLに接続するためのライブラリ

### database/sql

標準

### jmoiron/sqlx

構造体を保存

### jinzhu/gorm

メジャーなORM library
多機能でRails（CakePHP）的なイメージ

### ngorm/ngorm

gormのフォーク。拡張gormと呼ばれるものかな。。

### Masterminds/squirrel

SQLを書く時便利

### go-gorp/gorp

シンプルなORM

### go-xorm/xorm

けっこうスターの数が多い。
gormよりは自由度が高くアソシエーション周りの機能を持たないっぽい。

## naoina/genmai

ORMではなくクエリーベース。
標準のオブジェクトを持っていてよびだせるらしい。
レポジトリのドキュメントに一通り例があってわかりやすいかも。

## マイグレーションツール

docker、postgresql、を想定してマイグレーションツール。
コンテナを生成するときにマイグレーションを実行して初期化したりできるといいなと。

普通に使うなら`goose`、awsとか考えるなら`mattes/migrate`とかなのかな。
対応DBMSが多くて特化した対応が微妙ということがないかとか勘ぐりつつ
`mattes/migrate`をつかってみるか。

### 参考

* 差分や構造を意識した手法

	Goでのmigrationについて ~ ddl-maker × schemalex ~ - KAYAC engineers' blog
	http://techblog.kayac.com/2016/12/19/134515
	
* 最近のまとめ記事
	
	Go製マイグレーションツールまとめ - Qiita
	http://qiita.com/nownabe/items/1acce9f6b9f14f74c965#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86

* 候補
	
	mattes/migrate: Database migrations. CLI and Golang library.
	https://github.com/mattes/migrate
	
	rubenv/sql-migrate: SQL schema migration tool for Go.
	https://github.com/rubenv/sql-migrate
	
	Golang製DBマイグレーションツールgoose + MySQLを試してみた - Qiita
	http://qiita.com/K_ichi/items/b9362e3a3c5688e494e2

* 驚くばかり
	
	dhamaniasad/awesome-postgres: A curated list of awesome PostgreSQL software, libraries, tools and resources, inspired by awesome-mysql
	https://github.com/dhamaniasad/awesome-postgres#utilities
	
* 公式のライブラリのリンク
	
	Projects · golang/go Wiki
	https://github.com/golang/go/wiki/Projects

* 最近の比較

	Go schema migration tools - Povilas Versockas
	https://povilasv.me/go-schema-migration-tools/

## mattes/migrateを使って見る

DBMSごとに接続のインターフェイスが違う。。
調べて行くと、postgreのドライバとしては`github.com/lib/pq`を使っているみたい。
なんか、この辺り安定してない感じがするけどこれになれていくのがいいのかな。
昔perlを手探りしていた頃を思い出すわー。

接続さえしてしまえば、いろいろ共通の記述でできるのかな。。若干不安。
当面はpostgreにしかつかわないはずだけど。

Advanced Usage · GORM Guide
http://jinzhu.me/gorm/advanced.html#sql-builder

pq - GoDoc
http://godoc.org/github.com/lib/pq

## gormのマイグレーション機能

サンプルコードがあるので実行してみた
構造体の定義がDB定義になっていてマイグレーションしてくれる

dropTableしなければ定義を毎回構造体に合わせて変更してくれるみたい。。
シンプルなデプロイをするならありなのか。。

なるほど、コードとは一体だと考えていいならこの方が整合性があるかしら。。
「コードファースト」という考え方なのかな。。
ActiveRecord的ともいうのかな。。

Go言語でのORMを色々検討してみた - タオルケット体操
http://hachibeechan.hateblo.jp/entry/2015/03/25/Go%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%AEORM%E3%82%92%E8%89%B2%E3%80%85%E6%A4%9C%E8%A8%8E%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F

	genmaiがオススメってお話なのかな

プロトタイピングするときとかはマイグレーションよりも小回りが利きそうな気がする。。

## gormの使い方

構造体の定義のこめんとでjsonとgormの両方の項目について記述してる。なるほど。

Go言語からORMマッパーをつかってMysqlを操作する - OngaLog
http://onga-tec.hatenadiary.jp/entry/2016/08/09/030319

jsonデータ型の扱い。

GolangでPostgreSQLのJSONデータ型を読み書きする - Qiita
http://qiita.com/qube81/items/8d4a766280c25d0ef16c

## gorpってなんだ

メジャーでシンプルなormパッケージという印象。
xormについても特徴の説明がわかりやすい

Go言語でORマップ - Qiita
http://qiita.com/awakia/items/d3f216cbb7aa14a2eca1

## xorm

gormが無難だけどxormも悪くなさそう。
ngormというフォークに言及あり。

golang + mysql の ORM を色々調べた感想とおすすめ - pospomeのプログラミング日記
http://pospome.hatenablog.com/entry/2017/02/18/172307

## genmaiの拡張

Genmai と Gorp プチ比較 ＋ おまけ - Qiita
http://qiita.com/jyagaimo_qiita_/items/707b53722b42e8c6eae9

## 接続情報

GORMの接続情報をtomlで設定できるようにした · polidog lab++
https://polidog.jp/2016/08/09/golang_gorm1/

## 結局

一旦、gormをつかってみて考えよう。
マイグレーションをどうするか。。
プロトタイピングではgormで、区切りでmattes/migrateとか？
合わせてメモリ上のsqliteで？`sql.Open("sqlite3", ":memory:")`