Playframework 2.4 evolution 在调试器中失败
Playframework 2.4 evolution fails in debugger
我有一个非常普通的 playframework 项目,它实现了一些休息服务。 'activator test' 运行 在命令行中没问题。当我尝试 运行 IntelliJ 15 调试器中的一项测试时,我的数据库演化脚本之一失败:
12:34:29.031 [main] ERROR play.api.db.evolutions.DefaultEvolutionsApi - Table "TOKEN" not found;SQL statement:
alter table "TOKEN" rename to "POS_TOKEN" [42102-187] [ERROR:42102, SQLSTATE:42S02]
我的 h2/2.sql 看起来像这样:
# --- !Ups
alter table "TOKEN" rename to "POS_TOKEN";
drop sequence "TOKEN_SEQ" ;
create sequence "POS_TOKEN_SEQ";
# --- !Downs
alter table "POS_TOKEN" rename to "TOKEN";
drop sequence "POS_TOKEN_SEQ" ;
create sequence "TOKEN_SEQ";
h2/1.sql的相关定义是
create table token (
id bigint not null,
access_token varchar(255) not null
constraint pk_token primary key (id))
;
只有在调试器中 运行ning 时,这种演变才会失败。 当使用 'activator run' 启动应用程序时,进化步骤 2 执行时没有错误,并且 table 被正确重命名。 我已经使用 h2 浏览器验证了这一点。
我使用的是 IntelliJ 15 旗舰版。调试配置为 Class#methodName, VM-arg is -ea, Working dir = $MODULE_DIR$
.
我与数据库交互的单元测试都扩展了 InMemoryDbTest:
public abstract class InMemoryDbTest {
protected final String fakeUser = "FakeUser";
public FakeApplication app;
@Before
public void before() {
Map<String, String> inMemoryDatabase = Helpers.inMemoryDatabase("h2");
app = Helpers.fakeApplication(inMemoryDatabase);
Helpers.start(app);
}
@After
public void after() {
Helpers.stop(app);
}
}
我很难过。感谢您提供解决此问题的任何帮助。
这个问题的关键是 IntelliJ 中的测试 运行ner 已设置为使用工作目录 = $MODULE_DIR$,在我的设置中它等于 $PROJECT_HOME/.idea/modules.
FakeApplication 尝试在 $MODULE_DIR/conf/evolutions/h2/1.sql 中找到进化脚本,但没有找到它,并继续根据最新版本的模型自动生成它。后来,它 运行 是针对数据库的演变。首先它找到新自动生成的 1.sql 并应用它,然后它尝试 运行 手动创建的 2.sql 和后续步骤。这些都失败了,因为初始 1.sql 不是 $APP/conf/evolutions/h2/1.sql 中的 1.sql,而是自动生成的 $MODULE_DIR$/conf/evolutions/h2/1.sql。
将测试的 运行 配置中的工作目录设置为空字符串解决了问题。
我有一个非常普通的 playframework 项目,它实现了一些休息服务。 'activator test' 运行 在命令行中没问题。当我尝试 运行 IntelliJ 15 调试器中的一项测试时,我的数据库演化脚本之一失败:
12:34:29.031 [main] ERROR play.api.db.evolutions.DefaultEvolutionsApi - Table "TOKEN" not found;SQL statement:
alter table "TOKEN" rename to "POS_TOKEN" [42102-187] [ERROR:42102, SQLSTATE:42S02]
我的 h2/2.sql 看起来像这样:
# --- !Ups
alter table "TOKEN" rename to "POS_TOKEN";
drop sequence "TOKEN_SEQ" ;
create sequence "POS_TOKEN_SEQ";
# --- !Downs
alter table "POS_TOKEN" rename to "TOKEN";
drop sequence "POS_TOKEN_SEQ" ;
create sequence "TOKEN_SEQ";
h2/1.sql的相关定义是
create table token (
id bigint not null,
access_token varchar(255) not null
constraint pk_token primary key (id))
;
只有在调试器中 运行ning 时,这种演变才会失败。 当使用 'activator run' 启动应用程序时,进化步骤 2 执行时没有错误,并且 table 被正确重命名。 我已经使用 h2 浏览器验证了这一点。
我使用的是 IntelliJ 15 旗舰版。调试配置为 Class#methodName, VM-arg is -ea, Working dir = $MODULE_DIR$
.
我与数据库交互的单元测试都扩展了 InMemoryDbTest:
public abstract class InMemoryDbTest {
protected final String fakeUser = "FakeUser";
public FakeApplication app;
@Before
public void before() {
Map<String, String> inMemoryDatabase = Helpers.inMemoryDatabase("h2");
app = Helpers.fakeApplication(inMemoryDatabase);
Helpers.start(app);
}
@After
public void after() {
Helpers.stop(app);
}
}
我很难过。感谢您提供解决此问题的任何帮助。
这个问题的关键是 IntelliJ 中的测试 运行ner 已设置为使用工作目录 = $MODULE_DIR$,在我的设置中它等于 $PROJECT_HOME/.idea/modules.
FakeApplication 尝试在 $MODULE_DIR/conf/evolutions/h2/1.sql 中找到进化脚本,但没有找到它,并继续根据最新版本的模型自动生成它。后来,它 运行 是针对数据库的演变。首先它找到新自动生成的 1.sql 并应用它,然后它尝试 运行 手动创建的 2.sql 和后续步骤。这些都失败了,因为初始 1.sql 不是 $APP/conf/evolutions/h2/1.sql 中的 1.sql,而是自动生成的 $MODULE_DIR$/conf/evolutions/h2/1.sql。
将测试的 运行 配置中的工作目录设置为空字符串解决了问题。