nFact

n!

Play Framework Evolutionsでファイル名を1.sql, 2.sql...以外にする

やりたいこと

Play Frameworkで用意されているDBマイグレーションツールにEvolutionsがあるが、ファイル名が連番でしか指定できず、後から見たときに何をやっているのかが分かりづらいなどの問題がある。 これを、下記のようにファイル名を指定できるようにしたい。

conf/evolutions/default
  1_create_table_users.sql
  2_create_table_roles.sql
  ...

ほとんど全く同じ事をする記事で下記の記事があったが、もっと簡単に出来たのでこの記事に残しておく。

コード

package modules

import java.io.{FileInputStream, InputStream}

import javax.inject._
import play.api.Environment
import play.api.db.evolutions._
import play.api.inject._

class EvolutionsModule extends SimpleModule(
  bind[EvolutionsConfig].toProvider[DefaultEvolutionsConfigParser],
  bind[EvolutionsReader].to[CustomEvolutionsReader],
  bind[EvolutionsApi].to[DefaultEvolutionsApi],
  bind[ApplicationEvolutions].toProvider[ApplicationEvolutionsProvider]
)

@Singleton
class CustomEvolutionsReader @Inject()(environment: Environment) extends ResourceEvolutionsReader {
  override def loadResource(db: String, revision: Int): Option[InputStream] = {
    val evolutionDirectory = environment.getFile(Evolutions.directoryName(db))
    evolutionDirectory.listFiles()
      .find(f => f.getName.endsWith(".sql") && f.getName.startsWith(s"${revision}_"))
      .map(new FileInputStream(_))
  }
}

さらに、元記事同様に application.conf に下記を追記する。

play.modules {
  enabled += "modules.EvolutionsModule"
  disabled += "play.api.db.evolutions.EvolutionsModule"
}

リロードすると連番SQL以外でもマイグレーションが適用される。

参考にしたサイト

ScalaMatsuri 2019に参加してきました

f:id:noko_k:20190628095247j:plain 6/27(木)~29(土)の3日間、日本最大級のScalaカンファレンス Scala Matsuri 2019が開催されました。
私は28,29日のカンファレンスDAY/アンカンファレンスDAYに参加してきましたので、その感想などの記事です。

参加したセッション

  • Scala 3って、私にはどんな影響があるの?
  • 決済サービスで Akka Cluster 使ってみた
  • コードから理解するPlayframeworkの脆弱性
  • Scala Driven Management
  • プロジェクトで引き回す型をEffにするメリット
  • こんなに違う!<-ScalaとKotlin->
  • Scala における関数型並行処理入門
  • ピュアなドメインを支える技術
  • 実践 Clean Architecture
  • ハウツー・テストproper{t,l}y
  • Phil Bagwell Award Kenji's Pull Request tutorial
  • AWS EKSとAkkaを使ってEvent Sourcingを作るにはどうしたらよいか

感想

6/28 カンファレンスDAY

カンファレンスDAYは一応業務扱いでの参加だったので、ちゃんと起きました(適当)

Scala 3って、私にはどんな影響があるの?

このセッションは同時通訳レシーバーをもらい忘れてしまったので、
内容は半分入ったかどうか、という感じでした(すみません)。

Scala 3(Dotty)の新機能紹介とマイグレーションについて。
発表があった新機能は、どれも便利そうに感じました。
個人的にはUnion Typeとかが便利そうだなーと思います。 また、implicit周りについてはいくつかのキーワード等の追加でシンプルになるみたいです。 マイグレーションについては、今までSBT側で頑張ってクロスビルドをしていますが、
これからは新しい中間表現であるTASTyが導入され、Scala 2.x系と3系のクロスビルドはTASTyのレイヤーで頑張るみたいです。

プロジェクトで引き回す型をEffにするメリット

FutureFuture[Try[E]]Future[Either[L, R]] それぞれプロジェクト内で引き回す型にする際はメリデメあるけれども Eff[R, A] は(少し難しい代わりに)それらのデメリットをだいたい解決出来て良いよ、という話で、わかりやすく説明して頂けたので内容が割とスッと入ってきました。

Scalaにおける関数型並行処理入門

slides.com

並行処理とはそもそもどういうものか?の説明と、コンテキストスイッチのオーバーヘッドについて説明しつつ、
Monix Taskなどの話に発展していくセッションでした。
私には難しいセッションでしたが、今後調べるキーワードとしていくつか持ち帰ることが出来たので、良かったなと思います。

6/29 アンカンファレンスDAY

(6/28にちゃんと起きたということで?)6/29はしっかりと寝坊をしてしまったので、午後遅めの時間からの参加となりました。 お昼の時間とか、休憩的な時間の取り方が微妙な感じになってしまい、時間の使い方がもったいない感じになってしまいました(3つしか出れなかった)ので、次はちゃんと起きたいという気持ち。

その他の感想

ノベルティ

今回は暑かったので扇子やうちわなど仰ぐ系のものがあって良かったです。

ビズリーチさんの型安全扇子 f:id:noko_k:20190628105502j:plain

null消しゴムとかが前にありましたが、今年もユニークですねぇ~

WiFi

CyberAgentさんからフリーWiFiが提供されていました。快適そのもので、とても素晴らしかった!と思います。
DataDogのダッシュボードを公開していたのも面白かったですね。

LT?をやっていたみたいで、聞きたかった。。

同時通訳

ScalaMatsuriには同時通訳がありました。
Scalaのテクニカルかつディープな話でも日本語で聞けるので、理解しやすかったと思います。

おわりに

今回のScala Matsuriも、楽しく情報をインプット出来たなと感じています。
私自身、業務でも趣味でもしばらくScalaを書かなくなってしまったので、今回のScala Matsuriはとても良い刺激になりました。
ありがとうございました。!