Вставка массива определяемых пользователем типов в Cassandra с использованием gocql

У меня есть UDT в Cassandra, и у меня есть таблица, в схеме которой есть массив этих UDT. Вот образец:

CREATE TYPE keyspace.test_type(
    x float, 
    y float)

В моей схеме есть

 CREATE TABLE test_table(
     key text,
     test_array list<FROZEN <test_type>>,
     PRIMARY KEY (key))

Внутри моего пакета go я построил структуру:

type Test_type struct{
     x float32
     y float32
}

Затем у меня есть функция, которая по сути возвращает список этого test_type: []test_type, назовем его my_array.

Когда я пытаюсь сделать вставку с помощью gocql, например:

 err := gocql.Session.Query('INSERT into test_table (key,test_array)
                             VALUES (?,?)', 'key', my_array).Exec()

Вместо массива я получаю кучу нулевых значений. По сути, test_type некорректно отображается на созданный мной UDT - это мое предположение.

По сути, мой вопрос заключается в том, как сопоставить структуру с переходом на udt, чтобы тип распознавался правильно. .


person h94    schedule 16.10.2018    source источник


Ответы (2)


Возможно, это не важно, но я читал на https://docs.datastax.com/en/cql/3.3/cql/cql_reference/collection_type_r.html, что это не так

CREATE TABLE test_table( key text, test_array list<FROZEN test_type>>, PRIMARY KEY (key))

но

CREATE TABLE test_table( key text, test_array list<FROZEN <test_type>>, PRIMARY KEY (key))

правильное определение таблицы. У меня нет возможности попробовать ваш код, скажите мне, если он что-то изменит.

Еще я прочитал в Обновить коллекцию тип настраиваемого типа в cassandra Я думаю, вам следует определить свой настраиваемый тип в Cassandra, потому что у вас есть список настраиваемого типа.

person falberto89    schedule 16.10.2018
comment
Эй, вы правы .. Это была синтаксическая ошибка с моей стороны. Взгляните на ответ, который я опубликовал. Предлагаемое изменение правильно записало данные в Кассандру :) - person h94; 17.10.2018
comment
Я видел. Сейчас я сомневаюсь в определении типа. Почему вы объявили test_type с x и y как float в Cassandra? Разве это не карты на Голанге? - person falberto89; 17.10.2018
comment
Вы тоже можете это сделать. Однако в моем случае использования я хотел представить его как структуру, а не карту. - person h94; 17.10.2018

Per: Преобразование структуры Go в JSON

Проблема была решена путем переименования полей в экспорт. Таким образом, gocql может видеть типы данных x и y.

Просто переименуйте x в X и y в Y. Сделаю трюк

person h94    schedule 16.10.2018