『Webアプリケーション構築入門』のデータベースアプリケーションをHeroku上で動かす方法


動作例

追記:無料で使えるHeroku Postgres Devは、行数が1万行に制限されることが発表されたので、別の方法(例:SQLiteを組み込む)を検討した方がいいでしょう。

何回かに分けて、拙著『Webアプリケーション構築入門 第2版』のJavaのウェブアプリをHeroku上で動かす方法を紹介してきました。

  1. MySQLからPostgreSQLへの移行
  2. Mavenの導入
  3. Herokuへのデプロイ

本質的な部分は以上で尽きているのですが、拙著の第9章で作成する郵便番号検索システム(Google Mapsとのマッシュアップ+Ajaxによるリアルタイム検索)を動作させるためには、Heroku上に郵便番号データベースを作らなければなりません。郵便番号データ程度の規模のデータをPaaSが無料(クレジットカード情報を入力せずに)で提供するデータベースにインポートするのは、面倒なことが多いのですが、Herokuも例外ではありません。ここでは、その方法を紹介します。

まず、Heroku Postgres Devを利用可能にします。本稿執筆時点で、このアドオンはクレジットカード情報を入力せずに利用できます。

以下のようなコマンドで、データベース情報を確認します。

heroku pg:info

この結果、データベース名が「HEROKU_POSTGRESQL_AQUA」だとわかったとします。そうしたら、以下のようなコマンドで、psqlで接続します(ファイアーウォールの中からだと接続できなくて、セキュアインターネット実験サービスでもだめだったりするから、後で何か考えないと・・・)。

heroku pg:psql HEROKU_POSTGRESQL_AQUA

テーブルを作り、データをインポートし、インデックスを張ります。に作成した/tmp/zip.csvをインポートしています。このファイルをHeroku側に転送しておく必要はありません。前に使った「COPY」は権限が無いため使えないので、代わりにpsqlのメタコマンドである「\copy」を使います。

CREATE TABLE zip (
  code CHAR(7) NOT NULL,
  address1 VARCHAR(10) DEFAULT '' NOT NULL,
  address2 TEXT NOT NULL,
  address3 TEXT NOT NULL,
  address4 TEXT NOT NULL,
  office TEXT NOT NULL
);

\copy zip FROM '/tmp/zip.csv' WITH CSV

CREATE INDEX code_idx ON zip.code;

\q

最初から使えるSHARED-DATABASEの代わりに、データベースをデフォルトに設定します。

heroku pg:promote HEROKU_POSTGRESQL_AQUA

これで郵便番号データベースは完成です。すでに紹介したアプリの配備方法を終わらせれば、拙著の郵便番号システムがHeroku上で動きます。