Play framework 2.3で、DBアクセス(with Slick)
Play framework 2.3で、DBアクセスを試みました。
最初、evolutionsとAnormでアクセスしようと思っていたのだけど、Anormに苦戦していろいろ検索していたら、どうやらSlickがはやりらしい? サンプルコードもわかりやすくて心そそられ、evolutionsでDBをCreateしたあと、Slickを使うという中途半端な感じでやりました。
そのときに参考にしたサイトとかをおぼえがき。
あとは最近は、「Scala逆引きレシピ」を翔泳社のPDFで購入したので、わからない単語や使い方を検索してます。技術書は電子版になると検索性が上がるのが本当にいい。。
- 翔泳社PDF↓
- Scala逆引きレシピ
- Amazon Kindle本へのリンク。少し安い↓
- Scala逆引きレシピ
余談だけど、図書館でこの本を借りたとき、「プログラミング」と大きく書かれたシールが貼られていて、「レシピ」という単語でもしや料理本に送られていたのではと邪推した。
環境は、Mac OS X Yosemite、Scala 2.11.6、Play framework 2.3、Slick 2.1、MySQL 5.6.24。
かんたんなDB設計からのevolutions
一応つくりたいWebアプリがあるので、簡単にDB設計もやってみました。
今回使うのはMySQLなので、ツールも使いながら以下の段取りで実施。
- MySQL WorkbenchでER図を作成してみる
- MySQL WorkbenchからDDLを吐き出す(File -> Export -> Forward Engineer SQL CREATE Script)
- DDLを少し手直ししてから、evolutionsの形式にコピペ
MySQL Workbenchに関しておぼえがき。
以下のサイトを参考にしました。
ER図は作りやすかった。
ただし、foreign keyの制約名が重複しててもエラーにならないので、そのあたりをツールに投げずにきちんと自分で管理することは必要。
evolutionsに関しておぼえがき。
以下のサイトを参考にしながら、MySQL Workbenchから吐き出したDDLをコピペしました。
- Evolutions - 2.3.x
- Playframework 2.0(Scala)でサンプルアプリケーション作成-1.下準備 | DevelopersIO
- Play2.0(Scala)でMySQLを使う | mwSoft
いくつか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)
いい記事があったので参考サイトに加えます。ジェネレータをちゃんと使えるようにしておきたい。