Scala Slick, how to create Schema ONLY if it does not exist

In Slick 3.3.0 createIfNotExists and dropIfExists schema methods were added. So:

db.run(coffees.schema.createIfNotExists)

Googled this question and tried several solutions from answers until figured it out.


This is what I do for multiple tables, with slick 3.1.1 and Postgres

import slick.driver.PostgresDriver.api._
import slick.jdbc.meta.MTable
import scala.concurrent.Await
import scala.concurrent.duration.Duration
import scala.concurrent.ExecutionContext.Implicits.global

val t1 = TableQuery[Table1]
val t2 = TableQuery[Table2]
val t3 = TableQuery[Table3]
val tables = List(t1, t2, t3)

val existing = db.run(MTable.getTables)
val f = existing.flatMap( v => {
    val names = v.map(mt => mt.name.name)
    val createIfNotExist = tables.filter( table =>
        (!names.contains(table.baseTableRow.tableName))).map(_.schema.create)
    db.run(DBIO.sequence(createIfNotExist))
})
Await.result(f, Duration.Inf)

Tags:

Scala

Slick