Правильный способ изменить таблицу Cassandra через C # - PullRequest
2 голосов
/ 06 мая 2019

Моя проблема в следующем.

В моем коде есть следующая простая модель:

public class Client
{
    public Guid Id { get; set; }

    public string Name { get; set; }
}

Я определил для него отображение:

public class CustomMappings : Mappings
{
    public CustomMappings()
    {
        For<Client>().TableName("clients")
                     .PartitionKey(x => x.Id);
    }
}

Я создал таблицу с помощью Table<TEntity>.CreateIfNotExist() метода:

var table = new Table<Client>(session);
table.CreateIfNotExists();

И я могу вставить свои данные следующим образом:

IMapper mapper = new Mapper(session);

var client = new Client
{
    Id = Guid.NewGuid(),
    Name = "John Smith"
};

await mapper.UpdateAsync(client);

После этого я изменил свою модель, добавив новое свойство:

public class Client
{
    public Guid Id { get; set; }

    public string Name { get; set; }

    public string Surname { get; set; }
}

Мне нужно изменить эту таблицу, потому что я хочу добавить в нее столбец фамилии. Конечно, у меня есть исключение без него, когда я пытаюсь вставить значение:

Cassandra.InvalidQueryException: Undefined column name surname
   at Cassandra.Requests.PrepareHandler.Prepare(PrepareRequest request, IInternalSession session, Dictionary`2 triedHosts)
   at Cassandra.Requests.PrepareHandler.Prepare(IInternalSession session, Serializer serializer, PrepareRequest request)
   at Cassandra.Session.PrepareAsync(String query, IDictionary`2 customPayload)
   at Cassandra.Mapping.Statements.StatementFactory.GetStatementAsync(ISession session, Cql cql, Nullable`1 forceNoPrepare)
   at Cassandra.Mapping.Mapper.ExecuteAsync(Cql cql)

Но класс Cassandra.Data.Linq.Table<TEntity> не содержит ни методов, ни .AlterOrCreate(), ни .Alter(). Кроме того, у нас нет .GetAlter() метода в Cassandra.Mapping.Statements.CqlGenerator.

Какой способ больше подходит для решения этой проблемы? У меня есть два предположения (помимо создания запроса на получение с необходимыми методами для хранилища данных dshastax csharp драйвер на github:)).

  1. Чтобы изменить таблицы с помощью скрипта cql в файле .cql, который будет выполняться в коде c #.
  2. Для создания новой таблицы после каждого изменения модели и переноса в нее старых данных.

Я новичок в Кассандре, и у меня есть подозрения, что необходимого метода не существует в библиотеке по уважительной причине. Может быть, есть проблемы с согласованностью после изменения, потому что Cassandra - это распределенная база данных?

1 Ответ

2 голосов
/ 06 мая 2019

Изменения в схеме Cassandra должны быть сделаны очень точно - вы правы в отношении распределенной природы этого, и при внесении изменений вы должны принять во внимание. Обычно рекомендуется вносить изменения только через один узел, и после выполнения любого оператора DDL (создание / удаление / изменение) необходимо проверить соответствие схемы (например, с помощью метода CheckSchemaAgreementAsync из * 1004). * class) и не выполняйте следующую инструкцию, пока схема не будет согласована.

Говоря о самих изменениях - я не уверен, что драйвер C # может автоматически генерировать изменения для схемы, но вы можете выполнить изменения как команды CQL, как описано в документации (пожалуйста, внимательно прочитайте об ограничениях!). Изменения в схеме можно разделить на 2 группы:

  1. Это можно применить к таблице без необходимости переноса данных
  2. Это потребует создания новой таблицы с желаемой структурой и переноса данных.

В первой группе мы можем сделать следующее (возможно, не полный список):

  • Добавить новый обычный столбец в таблицу
  • Удалить обычный столбец из таблицы
  • Переименовать столбец кластеризации

Вторая группа включает в себя все остальное:

  • Изменение первичного ключа - добавление или удаление столбцов в / из него
  • Переименование некластеризованных столбцов
  • Изменение типа столбца (действительно рекомендуется создать совершенно новый столбец с требуемым типом, скопировать данные, а затем удалить исходный столбец - не рекомендуется использовать одно и то же имя с другим типом, поскольку это может сделать ваши данные недоступными). )

Миграция данных может выполняться различными инструментами, и это может зависеть от конкретных требований, таких как изменение типа и т. Д. Но это другая история.

...