2014-01-28 49 views
2

在生產中,我使用的是Oracle,我的所有更改日誌都是在Oracle的基礎上編寫的。 在我的開發環境中,我試圖在Oracle兼容模式下在H2實例上生成更新日誌。 這是爲了提高集成測試速度。在Oracle兼容性模式下H2驗證爲H2,而不是oracle

我的問題是,Liquibase正在驗證我對H2的更改日誌,而不是Oracle。 有沒有辦法強制Liquibase對Oracle進行驗證,即使我的db url看起來像H2一樣?

我最大的煩惱是關於序列和dropNotNullConstraint驗證。

Liquibase版本: 2.0.5(我也試圖與3.1.1,同樣的問題)

H2連接網址: JDBC:H2:TCP://本地主機:9092 /測試; MODE = Oracle; AUTO_SERVER = TRUE; DB_CLOSE_DELAY = -1

我很確定這是一個常見的情況,所以我想我可能做錯了什麼?

任何幫助,將不勝感激

+0

你是從代碼還是從cmd調用Liquibase?如果來自代碼,那麼你使用什麼語言? –

+0

我正在使用gradle-liquibase-plugin [鏈接](https://github.com/tlberglund/gradle-liquibase-plugin),但我想我可能只是創建自己的定製gradle插件特定於項目我是在 –

回答

2

由於Liquibase是用Java實現,並且依賴於JDBC,我會使用Java的說明。 Liquibase有一個實施數據庫的列表。這取決於你如何從Java代碼中調用它,但假設你使用liquibase.database.DatabaseFactory,擴展它或實現類似的東西。通常您的代碼會是這個樣子(Scala中爲例):

def createLiquibase(dbConnection: Connection, diffFilePath: String): Liquibase = { 
    val database = DatabaseFactory.getInstance.findCorrectDatabaseImplementation(new JdbcConnection(dbConnection)) 
    val classLoader = classOf[SchemaMigration].getClassLoader 
    val resourceAccessor = new ClassLoaderResourceAccessor(classLoader) 
    new Liquibase(diffFilePath, resourceAccessor, database) 
    } 

    def updateDb(db: DbConnectionProvider, diffFilePath: String): Unit = { 
    val dbConnection = db.getConnection 
    val liquibase = createLiquibase(dbConnection, diffFilePath) 
    try { 
     liquibase.update(null) 
    } catch { 
     case e: Throwable => throw e 
    } finally { 
     liquibase.forceReleaseLocks() 
     dbConnection.rollback() 
     dbConnection.close() 
    } 
    } 

注意這部分DatabaseFactory.getInstance.findCorrectDatabaseImplementation(new JdbcConnection(dbConnection))我們在java.sql.Connection傳遞和Liquibase找到合適Database實現它。您可以覆蓋findCorrectDatabaseImplementation,甚至完全創建您自己的Database子類。無論你喜歡什麼。

DatabaseFactory中的方法是public Database findCorrectDatabaseImplementation(DatabaseConnection connection) throws DatabaseException。從那裏您可以瞭解更多關於Database類型的信息。您可以從H2或Oracle繼承它並重寫某些部分。

如果你使用Liquibase cmd客戶端,你可以做我上面描述的,構建一個jar文件等,然後從命令行運行,確保你的類路徑上有新的類。

H2中的兼容性模式並不能保證完全支持Oracle,Postgres等,因此在它上測試Oracle DML是有點可疑的想法。它可能會工作,直到你找到它不。

+1

上工作我同意H2不完全模仿Oracle的風險,但我們有一個CI構建,它也將測試Oracle數據庫,目的主要是縮短開發人員的週轉時間。我會嘗試你的覆蓋'findCorrectDatabaseImplementation'方法的建議。 –