読者です 読者をやめる 読者になる 読者になる

プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

【Java】 Play!Framework 試してみた(続き)

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というエラーで起動できない

Ubuntu+Rails+PostgreSQL環境構築

 

更新履歴

2013/5/9  Herokuへのデプロイに関する記述を追記