Cassandra (CQL) select 使用 Cassandra4IO 进行查询

Cassandra (CQL) select IN query with Cassandra4IO

我正在将 scala 与 Cassandra4io 库一起使用。我正在尝试执行 select IN 查询。 IN 的参数就像一个元组(逗号分隔的字符串值)。它对我没有用。我尝试了不同的方法。

// keys (List[String])
 val clientIdCommaSepValues = keys.mkString(",")
val selectValue = selectQuery(clientIdCommaSepValues)

 private def selectQuery(clientids: String) =
    cql"select * from clientinformation WHERE (clientid IN (  ${clientids} ))".as[CassandraClientInfoRow]

这仅在值为 1 时有效(键的长度为 1)。


  private val selectQuery =
    cqlt"select * from clientinformation WHERE (clientid IN ${Put[String]}) ".as[CassandraClientInfoRow]

我还尝试在字符串上加上 ' ' 引号。

抱歉耽误了这件事。事实证明,在您的值周围添加额外的一组括号(在上面的示例中 IN (${clientIds}))会抛出字符串插值器,导致它 select 错误的 Binder 数据类型,该数据类型用于序列化您的数据类型在将其发送给 Cassandra 之前进行查询(哎哟!)。

此 select 编辑了 TEXT 而不是 List[TEXT]

您要做的是像这样重新制定查询:

val keys: List[String] = ???
val selectValue = selectQuery(keys)

 private def selectQuery(clientids: List[String]) =
    cql"select * from clientinformation WHERE clientid IN ${clientids}".as[CassandraClientInfoRow]"""

我能够在我这边重现这个并删除括号。这是我所做的

CREATE KEYSPACE example WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };

CREATE TABLE IF NOT EXISTS test_data (
    id TEXT, 
    data INT, 
    PRIMARY KEY ((id))
);
package com.ringcentral.cassandra4io

import cats.effect._
import com.datastax.oss.driver.api.core.CqlSession
import com.ringcentral.cassandra4io.cql._
import fs2._

import java.net.InetSocketAddress
import scala.jdk.CollectionConverters._

object Investigation extends IOApp {
  final case class TestDataRow(id: String, data: Int)

  def insert(in: TestDataRow, session: CassandraSession[IO]): IO[Boolean] =
    cql"INSERT INTO test_data (id, data) VALUES (${in.id}, ${in.data})"
      .execute(session)

  override def run(args: List[String]): IO[ExitCode] = {
    val rSession = {
      val builder =
        CqlSession
          .builder()
          .addContactPoints(List(InetSocketAddress.createUnresolved("localhost", 9042)).asJava)
          .withLocalDatacenter("dc1")
          .withKeyspace("example")

      CassandraSession.connect[IO](builder)
    }

    rSession.use { session =>
      val insertData: Stream[IO, INothing] =
        Stream.eval(insert(TestDataRow("test", 1), session) *> insert(TestDataRow("test2", 2), session)).drain

      def query(ids: List[String]): Stream[IO, TestDataRow] =
        cql"SELECT id, data FROM test_data WHERE id IN $ids"
          .as[TestDataRow]
          .select(session)

      (insertData ++ query(List("test", "test2")))
        .evalTap(i => IO(println(i)))
        .compile
        .drain
        .as(ExitCode.Success)
    }
  }
}

这很好用,因为现在它 select 是正确的活页夹,如您在上面看到的 List(TEXT)!对于您遇到的麻烦和神秘的错误消息,我们深表歉意,但感谢您使用此库 :D