在Play中,我可以根据数据库类型应用不同的进化吗?

时间:2014-02-23 11:43:19

标签: database playframework playframework-2.0 h2 playframework-evolutions

我的Play应用程序使用postgres。它包括一些特定于postgres的演变,这使我无法使用内存中的h2数据库进行测试。例如,以下演变在Postgres中很好但在h2中失败(即使使用MODE=PostgreSQL):

alter table ac_host rename column base_url to baseurl;

h2当量是:

alter table ac_host alter column base_url rename to baseurl;

我想在我的一些测试中使用h2,但由于h2不兼容的演变,尝试这样做会导致应用程序初始化失败。有没有办法解决这个问题,例如:通过根据数据库类型指定替代演变?

2 个答案:

答案 0 :(得分:3)

测试纯粹主义者和Cake Pattern粉丝可能不会喜欢这个答案,但我们遇到了同样的问题,并且正在执行以下操作:

我们使用default数据库来运行应用程序(在生产系统上进行测试),但对于自动化测试(使用play test),我们使用单独的test db配置,它有自己的演变,并在H2而不是PostgreSQL上运行。

在Play中,您可以检查当前是否正在运行测试模式并可以相应地切换数据库:

lazy val default = Database.forDataSource {
    val defaultSource = current.configuration.getString("db.test.url").fold("default")(_ => "test")
    new play.api.db.DB.getDataSource(defaultSource)
}

对自动化测试进行单独的演进还有其他优点:您可以使用一些与您的其他测试系统不同的基本测试数据填充数据库。

希望有所帮助。

答案 1 :(得分:1)

很快:只有你的解决方案是git和几个分支。

顺便说一下,尽管Play支持许多数据库引擎,但我们认为,相同的产品具有这种灵活性。你自己向我们展示了这个原因 - 数据库差异很大,编写一个适用于不同数据库的演变通常都会失败(许多引擎甚至没有compatibility mode这样的东西。

在现实生活中,它可以被描述为:梅赛德斯 - 奔驰生产汽油发动机和柴油车,我买了最后一个选项,但想用汽油

从我们(一般webdevs )的经验中我们发现,在不同的引擎甚至同一引擎的不同版本上工作会带来意想不到的错误,因此拇指的规则是所有开发人员都在该项目使用与生产相同的版本。这很有效。