Привет, у меня есть вариант использования, в котором пользователь может создать вторичный индекс для любой таблицы, вызвав API. И я записываю эти индексы в общую таблицу, используя Map<text, Frozen>, где индексы — это тип, определяемый пользователем:
CREATE TYPE indexes (
local BOOLEAN,
index_name TEXT,
table_name TEXT,
columns SET<TEXT>
);
При вызове API создается вторичный индекс. Эта часть работает нормально. А вот обновление строки в общих таблицах — нет. Все данные в UDT сохраняются как нулевые:
{'table_table1_20e24b85_d425_11e_int13_idx': {local: null, name: null, table_name: null, columns: null}}
Вот мой код Go с реализацией gocqlx (config.GetScylla() возвращает сеанс gocqlx):
selectedTable.Indexes[indexName] = models.IndexModel{
Local: reqBody.Local,
Name: indexName,
TableName: selectedTable.InternalName,
Columns: reqBody.Columns,
}
stmt, names = qb.Update("tables").Set("indexes").
Where(qb.Eq("internal_name"), qb.Eq("name"), qb.Eq("description")).ToCql()
if err := config.GetScylla().Query(stmt, names).BindStruct(&selectedTable).ExecRelease(); err != nil {
utils.HandleErrorResponse(c, err)
return
}
Я надеюсь, что код достаточно понятен, но все, что я делаю, это создаю карту строк->индексов (UDT) для помещения в общую таблицу и обновляю с ее помощью общую таблицу.
Примечание: почему документация по gocqlx такая плохая?
неважно, после того, как я застрял на этом в течение 2 дней (я новичок в работе со Scylla (в том числе с расширением cassandra), я обнаружил, что определение тегов cql необходимо для пользовательских типов. Это не для таблиц, а для пользовательских типов.
type IndexModel struct {
Local bool
Name string
TableName string
Columns []string
}
стал
type IndexModel struct {
Local bool `cql:"local"`
Name string `cql:"name"`
TableName string `cql:"table_name"`
Columns []string `cql:"columns"`
}
Ваш ответ можно улучшить, добавив дополнительную вспомогательную информацию. Пожалуйста, отредактируйте , добавив дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.