我正在编写集成测试,并希望在每次测试后清理(postgres(数据库。因此,我认为对所有(实际上只有大部分(表执行级联截断操作是可行的。
我正在开发一个使用Kotlin、Spring和Jooq的应用程序,这就是为什么我用truncateCascade
来映像Truncator
类,我可以将其自动连接到我的SpringBootTest
类中。
import org.jooq.DSLContext
import org.jooq.Table
@Service
class Truncator(private val dsl: DSLContext) {
fun truncateCascade(tables: List<Table<*>>) {
dsl.truncate ...
}
// single truncate work only for tables without foreign key constraints
// so I can't simply iterate over all tables and call this method.
// fun truncate(table: Table<*>) {
// dsl.truncate(table).execute()
// }
}
基本上,我正在寻找truncateCascade
的实现(假设这不是一种错误的方法(。
在调查这个问题时,我发现了Jooq的TruncateCascadeStep的文档,并提到了continueIdentity或restartIdentity,但我对Jooq或一般数据库没有足够的经验来将其拼凑在一起。
您缺少的是在truncate()
命令上调用cascade()
:
fun truncate(table: Table<*>) {
dsl.truncate(table).cascade().execute()
}
另一种选择是简单地完全删除模式,然后从头开始重新创建。这对于测试来说可能更健壮,对于中小型模式来说不应该花费太多时间。