使用play framework 2.1,我正在尝试找到两种不同数据库配置的最佳方法:
虽然很容易做到这一点,但当我尝试两者时,我遇到了以下问题:
我的问题:任何人都可以推荐一种很好的方法来同时执行这两种操作(一直是mysql,只测试H2),而不会过度复杂地运行应用程序吗?谷歌没有帮助我。
感谢您的帮助。
答案 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
中找到更多详细信息