Play!Frameworkの試用を書いた別記事だと、チュートリアルで使うのはメモリ上のデータベースになります。これで開発するのはいまひとつ不便なので、開発環境にも、Heroku と同じ PostgreSQL を入れて動作させるようにします。
この際、意外とはまったので手順をまとめておきます。
なお、OSは別記事でも書いたように、Ubuntu12.04(64bit)、Play!Framework は 2.0.4 です。
PostgreSQLのインストール
PostgreSQLをインストールします。
mor@T105-PandRDev:~$ sudo apt-get install postgresql
インストール直後は、Unixユーザとして postgres およびDBユーザーとしても postgresが作成されます。
Play!FrameworkアプリでPostgreSQLを使うように設定する
この状態でアプリからPostgreSQLを使うように設定します。
前の記事で書いたものから変更します(Play!Frameworkのチュートリアルで作ったものです)。アプリのディレクトリがtodolistである場合に、todolist/conf/application.conf の内容を下記のように書き換えます。
db.default.driver=org.postgresql.Driver db.default.url="jdbc:postgresql://localhost:5432/mydb" db.default.user=postgres db.default.password=postgres
(参考)第2回Play frameworkのDB操作を楽にするEBeanの基礎知識
参考資料にあるように、db.default.url の localhost:5432/ の後ろには後で作成するデータベース名を指定しておきます。
なお、前回の記事で、Herokuへのデプロイ用に、project/Build.scala にpostgreSQLのJDBCドライバの依存性を書いているのでドライバに関する作業は特にありません。
PostgreSQL側の設定
この時点で、データベースがまだ作られていないので作成します。ここでは、mydbという名前のデータベースを作っています。
mor@T105-PandRDev:~$ sudo su - postgres [sudo] password for mor: postgres@T105-PandRDev:~$ createdb mydb postgres@T105-PandRDev:~$
データベースのリストを表示させてみます。
postgres@T105-PandRDev:~$ psql -l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- mydb | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | postgres | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | template0 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows) postgres@T105-PandRDev:~$
mydb というデータベースが新たに作られていることがわかります(なお、postgres, template0, template1は最初から存在します)。
また、UbuntuにpostgreSQLをインストールした時点では、DBユーザーpostgresにパスワードが設定されていないようなので、作成しておきます。
postgres@T105-PandRDev:~$ psql mydb psql (9.1.9) Type "help" for help. mydb=# alter user postgres password 'postgres'; ALTER ROLE mydb=# q postgres@T105-PandRDev:~$
(参考)Postgresql: password authentication failed for user “postgres”
SQLを発行する際はセミコロンをお忘れなく。
念のため、postgreSQLを再起動します。
mor@T105-PandRDev:~$ cd /etc/init.d/ mor@T105-PandRDev:/etc/init.d$ sudo ./postgresql restart * Restarting PostgreSQL 9.1 database server [ OK ] mor@T105-PandRDev:/etc/init.d$
これで、アプリケーションディレクトリに移り、アプリを実行します。
mor@T105-PandRDev:~$ cd todolist mor@T105-PandRDev:~/todolist$ play [info] Loading project definition from /home/mor/todolist/project [info] Set current project to todolist (in build file:/home/mor/todolist/) _ _ _ __ | | __ _ _ _| | | '_ | |/ _' | || |_| | __/|_|____|__ (_) |_| |__/ play! 2.0.4, http://www.playframework.org > Type "help play" or "license" for more information. > Type "exit" or use Ctrl+D to leave this console. [todolist] $ run --- (Running the application from SBT, auto-reloading is enabled) --- [info] play - Listening for HTTP on port 9000... (Server started, use Ctrl+D to stop and go back to the console...)
ブラウザでアクセスすると、インメモリDBのときと同じく、
Database 'default' needs evolution! An SQL script will be run on your database - Apply this script now!
と表示されるので、Apply this script now! ボタンを押すと、問題なくチュートリアルで作成した画面が表示されます。
確認のため、postgreSQL のコマンドラインクライアントからテーブルを見ると、
mor@T105-PandRDev:~$ sudo su - postgres postgres@T105-PandRDev:~$ psql mydb psql (9.1.9) Type "help" for help. mydb=# dt List of relations Schema | Name | Type | Owner --------+-----------------+-------+---------- public | play_evolutions | table | postgres public | task | table | postgres (2 rows) mydb=# mydb=# d task Table "public.task" Column | Type | Modifiers --------+------------------------+----------- id | bigint | not null label | character varying(255) | Indexes: "pk_task" PRIMARY KEY, btree (id) mydb=#
のように、taskテーブルが作成され、idとlabelというカラムが作成されていることがわかります。
Herokuへのデプロイ
前記事と同じく、Herokuへデプロイしてみます。
基本的には同じ手順ですが、conf/application.confに、postgreSQLのユーザー名、パスワードが書かれているとheroku上でクラッシュするので、コメントアウトしておきます。
なお、Procfileは、
web: target/start -Dhttp.port=${PORT} -DapplyEvolutions.default=true -Ddb.default.url=${DATABASE_URL}
のように、ドライバの記述をなくしても大丈夫です。
ご参考1:最初はうまくいかなかった理由
最初は、DBユーザーpostgresにパスワードを設定してなくてうまくいきませんでした。
次は、設定したつもりだったのですが、alter・・・のSQL文の最後に、セミコロンを付け忘れてはまりました。
パスワード設定はお気をつけください。
ご参考2:コマンドラインからのpsqlの実行について
普段Ubuntuにログインしているユーザーからpsql にユーザー指定オプション(-U)をつけて使おうとすると、
mor@T105-PandRDev:~$ psql mydb -U postgres -W Password for user postgres: psql: FATAL: Peer authentication failed for user "postgres" mor@T105-PandRDev:~$
のようにエラーになります。一方、sudo su - postgres のように、一旦、postgresユーザーになってから、psqlを実行すると問題なく実行できます。
これは、UbuntuでのpostgreSQLインストール直後の設定では、ローカルからの接続には、peer認証というものが使われるためです。peer認証は、シェルのユーザーとDBユーザーが一致している場合のみ認証されるようです(なので、-Uオプションでユーザー名を指定して、-Wオプションでパスワードの入力をしても駄目なようです)。
これを避けて、-Uで指定したユーザーで認証するためには、postgreSQLの設定を変更します。設定ファイルを開いて、
mor@T105-PandRDev:~$ cd /etc/postgresql/9.1/main/ mor@T105-PandRDev:/etc/postgresql/9.1/main$ sudo cp -p pg_hba.conf pg_hba.conf.org mor@T105-PandRDev:/etc/postgresql/9.1/main$ sudo vi pg_hba.conf
次のように、peer とある部分を md5 に編集します、
# Database administrative login by Unix domain socket #local all postgres peer local all postgres md5
postgreSQLを再起動します。
こうすると、
mor@T105-PandRDev:~$ psql mydb -U postgres -W Password for user postgres: psql (9.1.9) Type "help" for help. mydb=#
のようにユーザー名を指定してログインできるようになります。
(参考)
UbuntuにPostgreSQL 9.1をインストールする
psqlがPeer authentication failedというエラーで起動できない
更新履歴
2013/5/9 Herokuへのデプロイに関する記述を追記