Как обновить таблицу в Призраке для Кассандры Scala - PullRequest
0 голосов
/ 13 июня 2019

Я создал следующую таблицу для Кассандры

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) ))
}

В приведенной выше таблице я хочу иметь возможность обновлять таблицу на основе id или provider_message_id.

Я могу легкообновить строку с помощью id

update().where(_.id eqs message.id)...

Но я не могу обновить таблицу с помощью provider_message_id

update().where(_.provider_message_id eqs callback_id)...

Как использовать несколько полей для обновления таблицы в Кассандре

1 Ответ

1 голос
/ 15 июня 2019

Существует ограничение для обновлений Cassandra в том, что они будут работать только с первичным ключом.Первичным ключом может быть один столбец (с именем ключа раздела) или несколько столбцов (ключ раздела и один или несколько ключей кластеризации).

В случае, если вы предоставляете, необходимо убедиться, что оба id и provider_message_id являются частью первичного ключа, описание таблицы с 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)...
...