Play Framework 2.1 と MySQL で Slick 1.0 を使用しています。
テーブルが存在しない場合にのみ行われるように、ddl テーブルの作成を制御したいと思います。つまり、テーブルは最初にプレイを開始したときにのみ作成する必要があります。
スリックでそれを行う方法は?
Play Framework 2.1 と MySQL で Slick 1.0 を使用しています。
テーブルが存在しない場合にのみ行われるように、ddl テーブルの作成を制御したいと思います。つまり、テーブルは最初にプレイを開始したときにのみ作成する必要があります。
スリックでそれを行う方法は?
テーブルの作成を個別に制御して DRY に保つのが好きなので、アプリにユーティリティ メソッドを追加する傾向があります。
def createIfNotExists(tables: TableQuery[_ <: Table[_]]*)(implicit session: Session) {
tables foreach {table => if(MTable.getTables(table.baseTableRow.tableName).list.isEmpty) table.ddl.create}
}
次に、暗黙的なセッションでテーブルを作成できます。
db withSession {
implicit session =>
createIfNotExists(table1, table2, ..., tablen)
}
他の人のために、SLICK はデータベースに存在するテーブルの数をカウントするために使用できるMTableオブジェクトを提供します。
それらが存在しない場合は、条件付きで ddl を呼び出すことができます。以下のケースでは、11 個のテーブル + play_evolutions テーブルがあると予想されます
import scala.slick.jdbc.meta._
if (MTable.getTables.list().size < 12) {
(Contacts.ddl ++ ThirdParties.ddl ++ Directorates.ddl ++ ServiceAreas.ddl ++ ICTServers.ddl
++ ICTServerDependencies.ddl ++ ICTSystems.ddl ++ ICTSystemDependencies.ddl ++ ICTSystemServerDependencies.ddl
++ CouncilServices.ddl ++ CouncilServiceDependencies.ddl).create
}
質問はSlick 1に関するものだと思いますが、Slick 3で完全を期すために、次のことを行います。
Await.result(createTableIfNotExists(tableQuery1, tableQuery2, tableQuery3), Duration.Inf)
private def createTableIfNotExists(tables: TableQuery[_ <: Table[_]]*): Future[Seq[Unit]] = {
Future.sequence(
tables map { table =>
db.run(MTable.getTables(table.baseTableRow.tableName)).flatMap { result =>
if (result.isEmpty) {
db.run(table.schema.create)
} else {
Future.successful(())
}
}
}
)
}