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
我正在将 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