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

Dan*_*aty 5 mysql playframework-2.0

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

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

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

  1. 我不能拥有相同的数据库演变,因为即使在mysql模式下,也有一些特定于mysql的命令不能用于H2:这意味着两组演进和两个独立的数据库名称
  2. 我不确定如何覆盖主要的application.conf文件,另一个保留在测试模式下进行测试.我尝试(从命令行传递文件名或覆盖键)似乎是保留给prod模式.

我的问题:任何人都可以推荐一个好的方法来做两个(一直是mysql,只测试H2),而不会过度复杂地运行应用程序?谷歌没有帮助我.

谢谢你的帮助.

Jam*_*pic 5

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

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

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

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

如果你想为dev和prod使用不同的配置,你可能最好为prod配备额外的配置.这样做的原因是你可能会启动你的d​​ev服务器play run,并启动你的prod服务器play stage; target/start.target/start可以采取-Dconfig.resource参数.例如,prod.conf为prod 创建一个额外的配置文件,如下所示:

include "application.conf"

# Extra config for prod - this will override the dev values in application.conf
db.default.driver=...
db.default.url=...
...
Run Code Online (Sandbox Code Playgroud)

并创建一个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
Run Code Online (Sandbox Code Playgroud)

理论上,你可以反过来做,并application.conf包含prod conf,并创建一个dev.conf文件,但你可能想要一个脚本启动prod(你可能最终需要额外的JVM /内存/ GC参数,或将其添加到rc.d,或其他).


bie*_*ior 2

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

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

  • 这大概就是 H2 的 MySQL 兼容模式的用途。 (2认同)