2013-03-14 8 views

Antwort

11

Für andere bietet SLICK ein MTable Objekt, mit dem Sie die Anzahl der Tabellen in Ihrer Datenbank zählen können.

Sie können das ddl dann bedingt aufrufen, wenn sie nicht vorhanden sind. Im Fall unter I 11 Tabellen + die play_evolutions Tabelle

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

Für eine einzelne Tabelle: 'if (MTable.getTables ("test") .list.isEmpty) Test.ddl.create' – ArtemGr

+1

Sie auch den Namen der Tabelle durch den Aufruf Test.tableName in Slick bekommen 1.0 und Test.baseTableRow.tableName in Slick 2.0 – cvogt

15

haben erwarten Da ich die Schaffung meiner Tabellen individuell zu steuern, wie und halten Sie es trocken, neige ich dazu nur ein Dienstprogramm Methode, um meine Apps hinzuzufügen:

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

Dann können Sie einfach Ihre Tabellen mit der impliziten Sitzung erstellen:

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

Dies scheint eine robustere Lösung als die akzeptierte Antwort –

8

wird mir klar, die Frage zu Slick 1 ist, aber aus Gründen der Vollständigkeit in Slick 3 I das tun Folgende:

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