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

Posted

技术标签:

【中文标题】在 Play 中,我可以根据数据库类型应用不同的进化吗?【英文标题】:In Play, can I apply different Evolutions depending on database type? 【发布时间】:2014-02-23 11:43:19 【问题描述】:

我的 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 不兼容的演变,尝试这样做在应用程序初始化时失败。有没有办法解决这个问题,例如通过根据数据库类型指定替代演进?

【问题讨论】:

【参考方案1】:

测试纯粹主义者和蛋糕模式爱好者可能不会喜欢这个答案,但我们遇到了和你一样的问题,并且正在做以下事情:

我们使用default 数据库来运行应用程序(在生产系统上进行测试),但对于自动化测试(使用play test),我们使用单独的test 数据库配置,它有自己的演变,并在 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)

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

希望对您有所帮助。

【讨论】:

【参考方案2】:

简而言之:唯一适合您的解决方案是 git 和几个分支。

顺便说一句,尽管 Play 支持许多数据库引擎,但并不认为相同的产品能够以如此灵活的方式投入使用。您正在向我们展示自己的原因 - 数据库差异很大,并且编写适用于不同数据库的演变通常会失败(许多引擎甚至没有像 compatibility mode 这样的东西。

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

根据我们(一般 webdevs)的经验,我们发现在不同引擎甚至同一引擎的不同版本上工作可能会带来意想不到的错误,因此经验法则是所有开发人员在该项目使用与生产相同的版本。这行得通。

【讨论】:

根据我的经验,如果您使用不同的内存数据库进行单元测试,这可能是一个非常好的设置。 Liquibase 在这方面做得很好,因为它可以定制它发出的 SQL 以针对多个数据库供应商。

以上是关于在 Play 中,我可以根据数据库类型应用不同的进化吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Play Billing Library手动续订订阅?

不同 Play 管理中心帐户的应用使用相同的 firebase 帐户?

play 2.0 中 prod 和 dev 的不同路线

Play scala中ApplicationLifecycle挂钩中的可调用类型错误

我在创建这种类型的 Play 商店应用程序图标时遇到了麻烦,任何人都可以帮助我

Play框架中是不是可以有多个消息文件