在测试中使用dev / prod和H2中​​的Mysql

时间:2013-04-08 18:01:43

标签: mysql playframework-2.0

使用play framework 2.1,我正在尝试找到两种不同数据库配置的最佳方法:

  • 一个基于mysql运行我的应用程序
  • 根据H2
  • 测试我的应用程序

虽然很容易做到这一点,但当我尝试两者时,我遇到了以下问题:

  1. 我不能拥有相同的数据库演变,因为即使在mysql模式下,也有一些特定于mysql的命令不能用于H2:这意味着两组演进和两个独立的数据库名称
  2. 我不确定如何覆盖主要的application.conf文件,另一个保留用于在测试模式下测试。我试过的(从命令行传递文件名或覆盖键)似乎是保留给prod模式。
  3. 我的问题:任何人都可以推荐一种很好的方法来同时执行这两种操作(一直是mysql,只测试H2),而不会过度复杂地运行应用程序吗?谷歌没有帮助我。

    感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

你可能会发现一些有用的技巧。

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

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

这不是一个灵丹妙药,但它会让你记录MySQL和H2的语法之间的一些差异。这是一个MySQL主义,所以它对其他数据库没有帮助,但由于大多数其他数据库并不像MySQL那样古怪,你可能不需要它 - 我们将数据库从MySQL迁移到PostgreSQL,而不是支持/*! */表示法,但PostgreSQL与H2相似,我们不需要它。

如果你想为dev和prod使用不同的配置,你可能最好为prod配备额外的配置。这样做的原因是您可能会使用play run启动您的开发服务器,并使用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包含prod conf,并创建一个dev.conf文件,但你可能想要一个脚本开始prod(您可能最终需要额外的JVM /内存/ GC参数,或将其添加到rc.d或其他任何内容。

答案 1 :(得分:2)

使用不同的数据库引擎可能是最糟糕的情况,正如您自己写的那样:某些功能,保留关键字等的差异导致您需要编写特定于所选数据库引擎的非常的自定义语句。最好使用相同的引擎使用两个独立的数据库。

不幸的是我不知道配置覆盖的问题,所以如果覆盖配置的默认方法失败...覆盖application.conf中的id - 所以你将能够快速评论整个块...)

答案 2 :(得分:1)

以下是如何在内存数据库中使用测试:

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

    /// skipped ....
}

inMemoryDatabase()默认使用H2驱动程序。 您可以在source code

中找到更多详细信息