endless pulse

どっくんどっくんふるえる毎日を過ごしています

Play framework 2.3で、DBアクセス(with Slick)

Play framework 2.3で、DBアクセスを試みました。
最初、evolutionsとAnormでアクセスしようと思っていたのだけど、Anormに苦戦していろいろ検索していたら、どうやらSlickがはやりらしい? サンプルコードもわかりやすくて心そそられ、evolutionsでDBをCreateしたあと、Slickを使うという中途半端な感じでやりました。

そのときに参考にしたサイトとかをおぼえがき。
あとは最近は、「Scala逆引きレシピ」を翔泳社のPDFで購入したので、わからない単語や使い方を検索してます。技術書は電子版になると検索性が上がるのが本当にいい。。

余談だけど、図書館でこの本を借りたとき、「プログラミング」と大きく書かれたシールが貼られていて、「レシピ」という単語でもしや料理本に送られていたのではと邪推した。

環境は、Mac OS X Yosemite、Scala 2.11.6、Play framework 2.3、Slick 2.1、MySQL 5.6.24。

かんたんなDB設計からのevolutions

一応つくりたいWebアプリがあるので、簡単にDB設計もやってみました。
今回使うのはMySQLなので、ツールも使いながら以下の段取りで実施。

  1. MySQL WorkbenchでER図を作成してみる
  2. MySQL WorkbenchからDDLを吐き出す(File -> Export -> Forward Engineer SQL CREATE Script)
  3. DDLを少し手直ししてから、evolutionsの形式にコピペ
MySQL Workbenchに関しておぼえがき。

ダウンロード (Oracleへのユーザ登録必要)

以下のサイトを参考にしました。

ER図は作りやすかった。
ただし、foreign keyの制約名が重複しててもエラーにならないので、そのあたりをツールに投げずにきちんと自分で管理することは必要。

evolutionsに関しておぼえがき。

以下のサイトを参考にしながら、MySQL Workbenchから吐き出したDDLをコピペしました。

いくつかDDLが間違っていて(orz…)エラーが出たのだけど、
そのエラーへの対処法にしばらく悩んだのでメモ。
1. Connection is closed! というエラー
そんな、evolutions実行してConnection is closed!ってそんなご無体な。ログをみてもConnectionが貼られてないわけではなさそうなんだけど…?

結局このエラーは、foreign keyの設定が、parent tableのカラムに対して、スペル間違えてたことが原因でした…。

どうやって見つけたかというと、以下の方法。
Up(Create)用のSQLを、CUIから実行する。

$ cd [Up用のSQL置いてる場所]
% mysql -u playusr -p
*パスワード入力
mysql > source [Up用のSQL].sql
^H→何かしらエラー出力
mysql > quit
$ mysql -u root(など、権限があるユーザ) -p
* パスワード入力
mysql > SHOW ENGINE INNODB STATUS;
→ざーっと情報が流れるので、
LATEST FOREIGN KEY ERROR
の項を見る。

エラーの詳細があるので、それに従いDDLを直す。

2. Can't write; duplicate key in table 'sampledb' というエラー
こちらは、同じDBスキーマ内のforeign keyのconstraint(制約)の名前が他のテーブルと重複していたことが原因でした。これだけだと「はて…?」という感じだったので、Connection is closed!のときと同じ方法で見つけました。

以下も参考にしました。

Slickでの接続

evolutionsまでやったあと、Anormを使おうとしてたんだけど、調べるうちにSlickというORMライブラリが使いやすそうじゃね…?となって、Slickを使うことにしました。
2015/5の時点で、Slickは3.0が最新のようだったけれど、3.0はあまり情報がなかったうえ2.xとかなり変わってる感じだったので、初心者はおとなしく2.1を使うことに。

以下のサイトが参考になります。(自分のこれからのおぼえがきとしてもメモ)


少しはまったのが、カラムがnullのものはOptionでくるんでおく必要があること。
エラーは以下のStackOverflowとまったく同じ…

Scala逆引きレシピにも書いてありました。。



DB接続までできたので、次はviewでフォームの表示・取得だ〜


★追記(2015-06-18)
いい記事があったので参考サイトに加えます。ジェネレータをちゃんと使えるようにしておきたい。