首页 > 解决方案 > 使用 slick 使用 scala 获取条件索引

问题描述

所以我试图实现从我的数据库到我的光滑表的索引。我使用 postgres 作为我的数据库,这就是我的索引的样子:

"index_unq_user_status" UNIQUE, btree (user_id) WHERE status::text = 'Pending'::text

基本上,如果它们都具有“待定”状态,则不能是具有相同 user_id 的两行。

我的问题是什么?当我用 Slick 生成我的表时,我得到了这个:

val index1 = index("index_unq_user_status", userId, unique=true)

这意味着,只能是一个用户 ID 的一行。

我想使用 h2 数据库进行集成测试,它使用 slick 中的表并创建错误的索引。

有什么方法可以在 slick 中实现该条件索引?

标签: scalaslickscalatest

解决方案


Sick 没有对部分索引的内置或直接支持。

但是,由于您index1正在创建 SQL DDL 语句以更改架构(如果您应用它们),您可以做的是: remove index1,而不是在应用表查询之后,.schema.create您可以运行一个普通的 SQL 语句来应用您的索引。

概括地说,这将是这样的:

val addIndex = sqlu""" ALTER TABLE table ADD INDEX ... """
val createAction = (MyTable.schema.create andThen addIndex)

我不确定您是如何构建 H2 集成测试的,但您可以有条件地在这些测试中省略特定addIndex于 PG 的测试。


推荐阅读