2013-03-14 7 views

Odpowiedz

11

Z korzyścią dla innych SLICK zapewnia MTable Obiekt, za pomocą którego można policzyć liczbę tabel obecnych w bazie danych.

Można wtedy warunkowo wywołać ddl, jeśli nie są obecne. W przypadku poniżej oczekiwać, aby mieć 11 tabel + stole 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 
} 
+4

Dla pojedynczej tabeli: 'if (MTable.getTables ("test") .list.isEmpty) Test.ddl.create' – ArtemGr

+1

Można również uzyskać nazwę tabeli, wywołując Test.tableName w Slick 1.0 i Test.baseTableRow.tableName w wersji Slick 2.0 – cvogt

15

Ponieważ lubię kontrolować tworzenie moich tabelach indywidualnie i zachować ją do sucha, po prostu wydają się dodać metodę użytkową do moich aplikacji:

def createIfNotExists(tables: TableQuery[_ <: Table[_]]*)(implicit session: Session) { 
    tables foreach {table => if(MTable.getTables(table.baseTableRow.tableName).list.isEmpty) table.ddl.create} 
} 

Następnie można po prostu stworzyć tabele z sesji niejawny:

db withSession { 
    implicit session => 
    createIfNotExists(table1, table2, ..., tablen) 
} 
+0

To wydaje się bardziej niezawodnym rozwiązaniem niż zaakceptowana odpowiedź –

8

uświadamiam sobie pytanie jest o Slick 1, ale w trosce o kompletność w Slick 3 i wykonaj następujące:

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