Goji というのは Go の Web アプリケーションフレームワークです。
機能的には薄めですが、標準の net/http
と違ってメソッドベースでのルーティングもでき、Ruby の Sinatra みたいなノリで使えると思います。
この記事では Goji で PostgreSQL にアクセスする Web API を作って、Heroku にデプロイします。
構成
- Go v1.4
- WAF: Goji v0.8.1
- ORM: Gorp v1.7
- PostgreSQL v9.4.0
作るもの
持ち物リストアプリのための RESTful な JSON Web API
(アプリの方も Swift で作って正月休み中に動かしたい)
できたもの
記事執筆時点でのコミットはこちらから
とりあえず自分の環境で動かしたい、という方のために Heroku Button も用意しています。
PostgreSQL への接続
Gorp の使い方それ自体への説明は省略します。
Heroku で heroku-postgresql
のアドオンを使用する場合は、環境変数 DATABASE_URL
にデータベースへの URL がセットされるので、それをそのまま利用するようにします。
db, err := sql.Open("postgres", os.Getenv("DATABASE_URL"))
今回 Gorp という ORM を使っていますが、Gorp は標準の database/sql
をラップしたものなので、sql.Open()
で環境変数 DATABASE_URL
を使うことだけ気をつければ、その他の ORM でも同じやり方でできると思います。
この場合、ローカルでの接続は以下のようになります。
$ DATABASE_URL=postgres://yuya@localhost/bali_api_development?sslmode=disable go run main.go
ユーザ名やデータベース名等についてはそれぞれの環境のものを指定してください。
私の場合は Homebrew でインストールしたものを使っており、以下の記事を参考にしました。
sslmode
については、ローカルで使っているものは SSL が有効でなかったので disable としましたが、heroku-postgres
においては sslmode=require
となっているようです。
Heroku へのデプロイ
Buildpack を使ったデプロイ
Go 用の Buildpack を使った一般的なデプロイの手順については以下の記事を参考にしました。
Goji の場合
Goji 特有の事情としては、ポート番号の指定をどうするか調べる必要がありましが、結論から言うと何も気にせずとも問題ありませんでした。
Goji はデフォルトでは 8000 版のポートでリッスンしますが、環境変数 PORT
がセットされていればそちらを使うようになります。
Heroku においては環境変数 PORT
がセットされるようになっているので、勝手に正しいポートが選択されるようになります。
まとめ
Goji と Gorp (というか github.com/lib/pq
) は Heroku フレンドリーな作りとなっており、簡単に Heroku にデプロイできました。