如何在 Cassandra Scala 的 Phantom 中更新 table
How to update table in Phantom for cassandra Scala
我为 Cassandra 创建了以下 table
abstract class MessageTable extends Table[ConcreteMessageModel, Message] {
override def tableName: String = "messages"
// String because TimedUUIDs are bad bad bad
object id extends Col[String] with PartitionKey {
override lazy val name = "message_id"
}
object phone extends Col[String]
object message extends Col[String]
object provider_message_id extends Col[Option[String]]
object status extends Col[Option[String]]
object datetime extends DateColumn {
override lazy val name = "message_datetime"
}
override def fromRow(r: Row): Message = Message(phone(r), message(r), Some(UUID.fromString(id(r))), None, status(r), Some( ZonedDateTime.ofInstant(datetime(r).toInstant, ZoneOffset.UTC) ))
}
在上面 table 中,我希望能够根据 id
或 provider_message_id
.
更新 table
我可以使用 id
轻松更新行
update().where(_.id eqs message.id)...
但我无法使用 provider_message_id
更新 table
update().where(_.provider_message_id eqs callback_id)...
如何在 cassandra
中使用多个字段来更新 table
Cassandra 更新有一个限制,即它们只能使用主键。主键可以是一列(命名分区键),也可以是多列(一个分区键,一个或多个聚簇键)。
在提供的情况下,需要保证id
和provider_message_id
都是主键的一部分,tablewith cql的描述应该是类似于:
cqlsh:> DESCRIBE keyspace1.messages;
...
CREATE TABLE keyspace1.messages (
id text,
phone text,
message text,
provider_message_id text,
status text,
datetime date,
PRIMARY KEY (id, provider_message_id)
) WITH CLUSTERING ORDER BY (provider_message_id ASC)
...
此外,请注意您需要在所有更新查询中使用 id
和 provider_message_id
(id
或 provider_message_id
没有更新)。您的代码将如下所示:
update().where(_.id eqs message.id).and(_.provider_message_id eqs callback_id)...
我为 Cassandra 创建了以下 table
abstract class MessageTable extends Table[ConcreteMessageModel, Message] {
override def tableName: String = "messages"
// String because TimedUUIDs are bad bad bad
object id extends Col[String] with PartitionKey {
override lazy val name = "message_id"
}
object phone extends Col[String]
object message extends Col[String]
object provider_message_id extends Col[Option[String]]
object status extends Col[Option[String]]
object datetime extends DateColumn {
override lazy val name = "message_datetime"
}
override def fromRow(r: Row): Message = Message(phone(r), message(r), Some(UUID.fromString(id(r))), None, status(r), Some( ZonedDateTime.ofInstant(datetime(r).toInstant, ZoneOffset.UTC) ))
}
在上面 table 中,我希望能够根据 id
或 provider_message_id
.
我可以使用 id
update().where(_.id eqs message.id)...
但我无法使用 provider_message_id
update().where(_.provider_message_id eqs callback_id)...
如何在 cassandra
中使用多个字段来更新 tableCassandra 更新有一个限制,即它们只能使用主键。主键可以是一列(命名分区键),也可以是多列(一个分区键,一个或多个聚簇键)。
在提供的情况下,需要保证id
和provider_message_id
都是主键的一部分,tablewith cql的描述应该是类似于:
cqlsh:> DESCRIBE keyspace1.messages;
...
CREATE TABLE keyspace1.messages (
id text,
phone text,
message text,
provider_message_id text,
status text,
datetime date,
PRIMARY KEY (id, provider_message_id)
) WITH CLUSTERING ORDER BY (provider_message_id ASC)
...
此外,请注意您需要在所有更新查询中使用 id
和 provider_message_id
(id
或 provider_message_id
没有更新)。您的代码将如下所示:
update().where(_.id eqs message.id).and(_.provider_message_id eqs callback_id)...