2011-09-19 60 views
3

我一直在開發一個使用H2作爲後端的Play框架(scala)的網站。測試很好地集成在一起,特別是能夠針對內存H2數據庫運行測試。與Postgres和h2兼容的Playframework evolutions文件

現在我想將我的數據存儲移動到Postgres出於各種便利的原因。這給我帶來了一個問題:如何繼續測試並保持每次測試運行的新鮮數據庫的簡單性?我在網絡上看到有些人設法對付postgres並對H2進行測試。但是,這兩者在SQL級別上並不完全兼容(即使在Postgres兼容模式下,H2也是如此)。例如,H2不支持SERIAL,BIGSERIAL和BYTEA。

我可以通過使用兩種方言的約束兼容交集來做到這一點,或者我還有其他技術嗎?

感謝您的任何幫助。

亞歷

回答

1

隨着進化文件直接使用SQL,除非你限制你自己到SQL的一個共同的跨數據庫兼容子集,你可能有問題。

沒有真正的解決方案,但仍然可以使用新的數據庫進行測試。只需進行如下設置:

%test.jpa.ddl=create-drop 
%test.db.driver=org.postgresql.Driver 
%test.db=<jdbc url> 
//etc 

這應該創建測試一個新的Postgres連接,從頭開始創建數據庫,運行變陣,做測試,並刪除進行一次所有數據。

1

我知道這是一個較舊的帖子,但它看起來像幾年後還沒有明顯的解決方案。

package support 

import play.api.db.evolutions.{ClassLoaderEvolutionsReader, Evolutions, ResourceEvolutionsReader} 

import java.io.{ByteArrayInputStream, InputStream} 
import java.nio.charset.StandardCharsets 
import scala.io.Source 
import scala.util.Try 

class EvolutionTransformingReader(
    classLoader: ClassLoader = classOf[ClassLoaderEvolutionsReader].getClassLoader, 
    prefix: String = "") 
    extends ResourceEvolutionsReader { 

    def loadResource(db: String, revision: Int): Option[InputStream] = 
    for { 
     stream <- Option(classLoader.getResourceAsStream(prefix + Evolutions.resourceName(db, revision))) 
     lines <- Try(Source.fromInputStream(stream).getLines).toOption 
     updated = lines map convertPostgresLinesToH2 
    } yield convertLinesToInputStream(updated) 

    private val ColumnRename = """(?i)\s*ALTER TABLE (\w+) RENAME COLUMN (\w+) TO (\w+);""".r 

    private def convertPostgresLinesToH2(line: String): String = 
    line match { 
     case ColumnRename(tableName, oldColumn, newColumn) => 
     s"""ALTER TABLE $tableName ALTER COLUMN $oldColumn RENAME TO $newColumn;""" 
     case _ => line 
    } 

    private def convertLinesToInputStream(lines: Iterator[String]): InputStream = 
    new ByteArrayInputStream(lines.mkString("\n").getBytes(StandardCharsets.UTF_8)) 
} 

然後將它傳遞:作爲一種短期修復,在遊戲的2.4.x-2.5.X(到目前爲止只測試了那裏),你可以通過創建一個自定義的變陣讀者改變在測試過程中變陣得到應用方式到您在您的測試應用變陣的地方:

Evolutions.applyEvolutions(registry.database, new EvolutionTransformingReader()) 

注意,讀者仍處於一個非常愚蠢的狀態(它假定SQL語句oneliners,這是不保證的),但是這應該是足夠的讓任何人開始。

+0

很高興知道,至少有一種方法可以解決這個問題。我們仍然在Play 2.3上,似乎沒有辦法重新命名列名。這就是爲什麼標準是好的,只有所有的供應商都遵循了這個標準...... –

相關問題