Play Framework(Scala)に入門する
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
play slickのバージョン依存関係
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
エラー
Cannot find an implicit ExecutionContext. You might pass
an (implicit ec: ExecutionContext) parameter to your method.
The ExecutionContext is used to configure how and on which
thread pools Futures will run, so the specific ExecutionContext
that is selected is important.
If your application does not define an ExecutionContext elsewhere,
consider using Scala's global ExecutionContext by defining
the following:
implicit val ec: scala.concurrent.ExecutionContext = scala.concurrent.ExecutionContext.global
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
Slick関連
qiitaの記事、めっちゃ参考になった。
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
- docker-composeでplay × postgresqlの環境を立ち上げる
- DB操作はSlick
- 何かしらのlintツール導入
- (余裕あれば)render.comにデプロイを試みる -> やっぱりデプロイはHerokuが楽そうかな...
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
特に参考
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
.gitignore
のために参考
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
バージョンの依存関係を調べる時に見る
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
build.sbt
とその他の箇所(ex.application.conf
)などで環境変数を使うときのimport方法の違い
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
render.com
でDockerデプロイのときのメモ
render側で設定した環境変数(env)は、Dockerfile内のARG
で参照できるっぽい?
CMD
時に使用するsecretなど。
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
デプロイ時、play.evolutions.db.default.autoApply=true
を明示的にセットしておかないとマイグレーションでエラーがでる。
play.evolutions.useLocks=true
play.evolutions.db.default.autoApply=true
play.evolutions.db.default.autoApplyDowns=true
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
本番デプロイ時、DBのコネクションに一般的なDB_URL(vendor://user:password@host:port/db
形式の文字列)を使用する場合は、
slick.dbs.default.db.dataSourceClass = "slick.jdbc.DatabaseUrlDataSource"
のようにセットしてDATABASE_URL
環境変数に値がセットされるようにすれば良い(もしくは、別の環境変数名でも明示的にセットできる)
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
Slickを使った find or insert
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
jwt-scalaのdocs
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
Slickにて、sortBy()
でソートしたクエリのresultをgroupBy()
すると、ソートが無効化されてしまう。
Stack Overflowで見つけた回答。
scalaのSeq.groupByで返されるデータはimmutable.Mapになっていて、このデータ構造は順序を持たないっぽい。回答で示されている拡張メソッドを使ったらうまくいったが。。クエリの時点で対応しないといけないのかもしれない。とりあえずこの回答に感謝。
というかやっぱデータ構造をちゃんと学ばないとダメだな。
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
クエリやリクエストパラメータをactionに渡す前に変換する
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
デフォルトのエラーをhtmlではなくjsonで返すための設定
application.conf
にplay.http.errorHandler = play.api.http.JsonHttpErrorHandler
を追加する。
![リアルにサーモン](https://res.cloudinary.com/zenn/image/fetch/s--dImU1Ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/c85bc8d579.jpeg)
How to write readable nested join queries with Slick 3.0