Подтвердить что ты не робот

Как выполнить DDL только тогда, когда таблицы не существуют?

Я использую Slick 1.0 с Play Framework 2.1 и MySQL.

Я хотел бы управлять созданием таблицы ddl, чтобы она выполнялась только в том случае, если таблицы не существуют. То есть, таблицы должны создаваться только при первом запуске игры.

Как это сделать в Slick?

4b9b3361

Ответ 1

В интересах других 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
}

Ответ 2

Так как мне нравится управлять созданием моих таблиц индивидуально и сохранять его СУХОЙ, я просто добавляю утилиту в свои приложения:

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)
}

Ответ 3

Я понимаю, что вопрос касается 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(())
          }
        }
      }
    )
  }