SQLを使うことになったのですがライブラリが複数ありどのライブラリを選んでいいか迷ったので比較してみます。ライブラリを導入する上でほしい機能は以下です。ORMをvolatiletech/sqlboilerにするとよさそう。Rails的にやりたいなら、マイグレーションとORMが一緒になっているgobuffalo/pop。マイグレーションにもSQLをかかない。9.6を立ち上げて実際に、コードを実行しながら、ライブラリごとにどのような利点や課題があるのかみていきます。docker-composeでデータベースの保存先をmacOS側にしなければ立ち上げごとにデータベースが初期化されるので楽です。使ったコードはhttps://github.com/wapa5pow/go-database-library-how-toにあげました基本、PostgreSQLでやっていきますが、MySQLにしかないライブラリの場合は、MySQLでやります。migrationライブラリの調査まずはmigration用のライブラリを試してみます。(だいたいGo製マイグレーションツールまとめと同じようになってしまった)liamstask/goosegooseはBitbucket上のものとGithub上のものがありソースコードも違います。migrationファイルがタイムスタンプになっているBitbucket上のものを使います。sqlコマンドラインでsqlを指定しないとGoのコードでmigrationファイルがかけます実行するとdb/migrations/20180904123223_create_users_table.sqlというファイルができるので、以下のように編集します。up実行するとデータベースに、goose_db_versionというテーブルができ以下のようなレコードができます。create_users_tablemigrations/postgres/20180904140112-create_users_table.sqlのようなタイムスタンプのついたファイルが作られるので以下のように編集します。upmigrationsというテーブルに以下のようなデータが入ります。down上記を実行すると、ロールバック後に、migrationsテーブルの該当レコードが消される所感gooseとだいたい一緒gooseより対応ドライバが多いtransaction内で実行できないSQL(PostgreSQLのindex作成など)の場合でもnotransactionをマイグレーションファイルにつけることにより対応できるnaoina/migumiguはGoのstructからマイグレーションします。github.com/naoina/migu/cmd/miguマイグレーションまずGoのstructでUserを定義します。string}miguコマンドを実行するとuser.goのstructを読み取ってテーブルを作ってくれます。migrationファイルは作られずに、そのままcreate文が発行されて適用されます。2回実行してもcreate文は発行されず冪等性が保たれています。0.011s--------primaryキーなどを設定したいときは、以下のようにアノテーションをつければ大丈夫です。configと実行するとdatabase.ymlの設定ファイルができるので以下のように編集します。structとマイグレーションファイルができます。マイグレーションファイルは、markbates/fizz形式になってます。postgresschema_migrationというテーブルができ、以下のレコードが入っている。postgresschema_migrationからはレコードがなくなる既存のデータベースのスキーマをダンプするpopには既存のデータベースのスキーマをダンプして、新しいデータベースに適用することができます。既存のテーブルがある状態からマイグレーションを導入したときにテストデータベースを作りたいなどのときに有用そうです。スキーマのダンプは以下でできます。実行されると、migrations/schema.sqlにスキーマファイルができます。dump既存のschema.sqlを適用するには以下です。load所感Railsっぽい2つのファイルにUP/DOWNをわけてかかなければいけないのがめんどくさいfuzzは覚えれば生のSQLを書くよりもやりやすそうコマンドでデータベースも作れる既存のデータベースがあって、マイグレーションを適用したいときにも使えるコネクションプールの数も設定ファイルにかけるcreated_atとupdated_atが自動的につく。popのORMを使えば自動で更新される。マイグレーションの適用日時がレコードにはいっていない。個人的に一番使いがってがよさそうk0kubun/sqldefデータベースのスキーマファイル(schema.sql)を作っておき、それとデータベースとの差分を修正するSQL(例えばALERT文)を出力してそれをマイグレーションとして適用する形です。最近コミットされていませんが、KAYACでも同じような思想の(schemalex/schemalex)を使っているようです。ここで実際の使い方がのっていました。sqldefの作者の方のこちらのブログにsqldefとschemalexとの違いがのっています。PostgreSQLはsslmode=disableをつけてビルドしてからやらないと動かなかったので、MySQLのほうで今回ためします。インストールこちらにあるようにバイナリをとってきて適当なところに置きます。スキーマの定義まずは何も定義されていないデータベースにusersテーブルを定義するためにschema.sqlを作ります。schema.sqlMySQLを確認するとusersテーブルがつくられています。次に、emailカラムをschema.sqlに足し、再度mysqldefコマンドを実行すると、ALTER文が発行されてemailカラムが追加されています。スキーマのエクスポート以下のコマンドで既存のデータベースのスキーマをエクスポートすることができます。所感まだ作られて間もないがいままでの重厚なマイグレーションと比べてスキーマだけをかけばいいシンプルさがある複雑なケースがでないかぎりこれで十分なきもする。各種ORMライブラリをみていきます。生のSQLを書くライブラリは使わないつもりなので調べていないです。gobuffalo/poppopの設定はマイグレーションで説明したやり方と同じです。"Ishida"}conn.Create(&user)conn.TX.Commit()}Selectページネーションは以下でできる。Bookに書き方がのっています。ドキュメントも充実している。PostgreSQLのjsonbなどにも対応できる。DeletedAtのフィールとが追加され、論理削除になる。Migrationというのがあり、マイグレーションの定義をかかなくてもGoのstructを見て、不足があれば追加してくれる。明示的にIndexを足したりもできる。Migrationはカラムを削除したりができないので使いづらそう。エラーが返り値でかえってくるのではなく、DBオブジェクトのフィールドとして入っているので若干扱いずらい。Poolの設定がコードでかけるロガーにどのようなクエリがサーバ側から発行されたのか出力できる。LoggerGorm用のマイグレーションヘルパーのgo-gormigrate/gormigrateというのもあるが、求めている形ではないgo-xorm/xormGormからフォークされて拡張されている。既存のデータベースをGoのコードとして落とせたりする楽観的ロックの仕組みがあるGo的なエラーの返し方をしてくれるマイグレーション的な機能もある。直リンクがつくれない。)ドキュメントがHTTPSでない。コネクションプールがある。全体的になんか若干不安。volatiletech/sqlboilersqlboilerは先にデータベースにテーブルが作られている状態で、その状態をsqlboilerコマンドでGoのstructで定義されたmodelsに落とすことでORMを実現しています。sqlboiler自体にはマイグレーションツールが付属していないので、gooseなど別途マイグレーションツールを使用する必要があります。github.com/volatiletech/sqlboiler/drivers/sqlboiler-psqlマイグレーションの作成と実行gooseを使って行っていきます。gooseのインストールなどに関しては前半部分にかいたので参照してください。pilots;マイグレーションを実行します。upコードsqlboilerの設定ファイルsqlboiler.tomlを書きテーブル定義からGoのコードにおとします。psql実行すると、models以下に各種Goのファイルが作られます。Incrementがきいた状態でレコードが追加されています。json.Marshal(p1)fmt.Println(string(j))}所感マイグレーションツールは別途必要だがよさそうグローバルなデータベースを定義でき、いちいちデータベースのインスタンスをわたさなくても実行できるようにもできる。ツール用とかでは便利そう。blogHomeAboutTool。