首先,JOOQ非常棒,为我节省了更多时间。最近我一直在考虑使用JOOQ进行测试,并且有一个很棒的MockResult和相关类来模拟DB的结果。但是,当然,测试数据库层的一个挑战是,您必须知道查询是否真正有效。
作为JOOQ,在生成类时,是否有效地获取了数据库的快照,为什么我们不能使用它来重新创建数据库进行测试?例如,在内存DB中启动并运行createDatabase()或getTableSql()类型命令。所以我的问题是,是否有人知道JOOQ可以实现的方式?
通过这样的设置,JOOQ可以传授它对DB结构的了解,虽然减去索引和其他细节,然后可以测试查询。当然我有数据库部署脚本,但这将允许纯粹的基于Java的解决方案。毕竟,如果数据库发生了变化,你还是需要重新生成JOOQ,所以为什么不在那个快照中工作呢。
除此之外,我已经有了一个checkDatabase()命令,该命令在应用程序启动时运行,循环遍历JOOQ表和字段以验证它们是否都存在,如果部署应用程序的环境不匹配则抛出异常拍摄的最后一张JOOQ快照。
答案 0 :(得分:3)
问题#3160已针对jOOQ 3.8实施
有了这个,你可以运行(例如):
for (Query query :
DSL.using(SQLDialect.H2, new Settings().withRenderFormatted())
.ddl(T_BOOK)
.queries()) {
System.out.println(query + ";\n");
}
...将打印(例如):
create table "PUBLIC"."T_BOOK"(
"ID" int not null,
"AUTHOR_ID" int not null,
"CO_AUTHOR_ID" int null,
"DETAILS_ID" int null,
"TITLE" varchar(400) not null,
"PUBLISHED_IN" int not null,
"LANGUAGE_ID" int not null,
"CONTENT_TEXT" clob null,
"CONTENT_PDF" blob null,
"REC_VERSION" int null,
"REC_TIMESTAMP" timestamp null,
constraint "PK_T_BOOK"
primary key ("ID"),
constraint "FK_T_BOOK_AUTHOR_ID"
foreign key ("AUTHOR_ID")
references "PUBLIC"."T_AUTHOR" ("ID"),
constraint "FK_T_BOOK_CO_AUTHOR_ID"
foreign key ("CO_AUTHOR_ID")
references "PUBLIC"."T_AUTHOR" ("ID"),
constraint "FK_T_BOOK_LANGUAGE_ID"
foreign key ("LANGUAGE_ID")
references "PUBLIC"."T_LANGUAGE" ("ID")
);