在开发/生产环境中使用Mysql,在测试环境中使用H2

6
使用play框架2.1,我正在尝试找到最好的方式来设置两个不同的数据库配置:
  • 一个基于mysql用于运行我的应用程序
  • 一个基于H2用于测试我的应用程序
虽然单独使用mysql或H2都很容易,但是当我同时使用时,就会遇到以下问题:
  1. 我不能拥有相同的数据库演变,因为有一些只能在mysql模式下才能使用的命令,这意味着需要两组演变和两个不同的数据库名称。
  2. 我不确定如何通过另一个专门用于测试的文件覆盖主应用程序.conf文件。我尝试过传递文件名或从命令行覆盖键,但似乎这是保留给生产模式的。
我的问题是:有谁能推荐一个好的方法来同时实现(始终使用mysql和仅在测试中使用H2),而不会过度复杂化应用程序的运行?谷歌并没有帮助我。
感谢您的帮助。

刚刚发现一个链接:http://play.lighthouseapp.com/projects/82401/tickets/981-overriding-configuration-for-tests,状态标记为`wontfix`. - biesior
谢谢。那解释得很清楚。 - Dan Serfaty
3个回答

6

以下是一些可能会有用的技巧。

首先,MySQL的/*! */符号允许您添加MySQL将遵守但其他数据库将忽略的代码,例如:

create table Users (
  id bigint not null auto_increment,
  name varchar(40)
) /*! engine=InnoDB */

这不是一种万能的解决方案,但它可以帮助您弥补MySQL和H2语法之间的差异。这是一个MySQL-ism,因此它对其他数据库没有帮助,但由于大多数其他数据库并不像MySQL那么古怪,您可能不需要它-我们将数据库从MySQL迁移到了不支持“/*! */”符号表示的PostgreSQL,但PostgreSQL与H2相似,因此我们不需要它。
如果您想为dev和prod使用不同的配置,最好为prod添加额外的配置。原因是您可能会使用play run启动dev服务器,使用play stage; target/start启动prod服务器。 target/start可以使用-Dconfig.resource参数。例如,为prod创建一个名为prod.conf的额外配置文件,如下所示:
include "application.conf"

# Extra config for prod - this will override the dev values in application.conf
db.default.driver=...
db.default.url=...
...

并创建一个类似如下的 start_prod 脚本:

#!/bin/sh

# Optional - you might want to do this as part of the build/deploy process instead
#play stage
target/start -Dconfig.resource=prod.conf

理论上,您可以反过来操作,并将application.conf包含生产配置,并创建dev.conf文件,但您可能仍需要脚本启动生产环境(您可能最终需要额外的JVM / 内存 / GC参数,或者将其添加到rc.d等)。

2

使用不同的数据库引擎可能是最糟糕的情况,就像你自己所写的一样:某些函数、保留关键字等方面的差异会导致您需要编写针对所选DB引擎非常特定的自定义语句。最好使用两个使用相同引擎的独立数据库。

不幸的是,我不知道有关配置覆盖的问题,因此如果默认的覆盖配置方法失败...请在application.conf中重写id - 这样您就可以快速注释整个块...)


2
这很可能是H2的MySQL兼容模式的作用。 - Peter Hilton
ORM 可以在一定程度上抵消数据库引擎的差异。 - Oleg Mikheev

1
这是如何在测试中使用内存数据库的方法:

public class ApplicationTest extends WithApplication {
    @Before
    public void setup() {
        start(fakeApplication(inMemoryDatabase("default-test"), fakeGlobal()));
    }

    /// skipped ....
}

inMemoryDatabase() 默认使用 H2 驱动程序。 您可以在 源代码 中找到更多细节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接