如何在 scala slick 中通过数组索引添加查询?

问题描述 投票:0回答:1

使用 scala slick,如何使用纯文本生成查询过滤器? 语境 - 我正在尝试过滤数组位置列,似乎不受 https://github.com/tminglei/slick-pg 提供的光滑扩展的支持。

即我们有一个数组字段:

   id UUID,
   name varchar,
   my_array_field varchar[],
   ...

我希望能够通过相当于以下的 sql 进行查询

SELECT FROM BLAH where name='somename' and my_array_field[2] = 'bar'

  • 有没有办法只注入文本字符串作为过滤器?即不是用于查询的灵活 sql 插值器,而只是一个过滤器元素?
  • 是否有通过数组元素检索的 slick 或 slick-pg 表示形式?
scala slick slick-pg
1个回答
0
投票

slick-pg 的自述文件中,您可以在 usage 部分看到如何使用该库的示例。您需要将

PgArraySupport
混合到配置文件中,将
ArrayImplicits
混合到
API
中。

trait MyPostgresProfile extends ExPostgresProfile
                           with PgArraySupport

  override val api = MyAPI

  object MyAPI extends ExtPostgresAPI with ArrayImplicits
}

object MyPostgresProfile extends MyPostgresProfile

然后您可以看到定义为

def tags = column[List[String]]("tags_arr")
的数组列以及使用过滤器
byTag
的方法
.filter(_.tags @& tags.toList.bind)

import MyPostgresProfile.api._

class TestTable(tag: Tag) extends Table[Test](tag, Some("xxx"), "Test") {
  def tags = column[List[String]]("tags_arr")
  def * = (tags) <> (Test.tupled, Test.unapply)
}

object tests extends TableQuery(new TestTable(_)) {
  // will generate sql like:
  //   select * from test where tags && ?
  def byTag(tags: String*) = tests
    .filter(_.tags @& tags.toList.bind)
    .map(t => t)
}

还有一个 README - Supported Array Oper/Functions 您可以查看。

© www.soinside.com 2019 - 2024. All rights reserved.