2013-03-14 16 views
11

Play Framework 2.1 ve MySQL ile Slick 1.0 kullanıyorum.Yalnızca tablolar yoksa DDL nasıl çalıştırılır?

Ben tabloları yokmuşçasına sadece gerçekleşir, böylece ddl tablo oluşturulmasını kontrol etmek istiyorum

. Diğer bir deyişle, tabloların sadece ilk oynamaya başladığım zaman yaratılması gerektiği söylenebilir.

Nasıl Slick'te Yapılır? Başkaları SLICK yararına

cevap

11

veritabanınızda mevcut tabloları sayısını saymak için kullanabileceğiniz bir MTable Object sağlar.

Ardından mevcut değilse, ddl'yi koşullu olarak arayabilirsiniz. durumda ben bireysel olarak benim tabloların oluşturulmasını kontrol ve KURU tutmak istiyorum bu yana 11 tablolar + play_evolutions tablo

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

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

+1

Ayrıca Slick de Test.tableName arayarak tablo adını alabilir eğer Slick 2.0'da 1.0 ve Test.baseTableRow.tableName – cvogt

15

olmasını bekliyoruz aşağıda, ben sadece benim apps bir yardımcı yöntemi eklemek eğilimindedir:

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

Sonra sadece örtülü oturumda ile tablolar oluşturabilirsiniz:

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

Bu, kabul edilen yanıtdan daha sağlam bir çözüm gibi görünüyor –

8

ben soru Slick 1 hakkındadır farkındayım ama Slick 3'te bütünlüğü uğruna yapmam Aşağıdaki: tek bir tablo için

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(()) 
      } 
     } 
     } 
    ) 
    } 
İlgili konular