Поддерживает ли GoCQL наборы и списки Cassandra? - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь вставить фрагмент Go в набор или список Cassandra, но, похоже, bind не понимает, как это сделать.Этот код работает нормально, но требует, чтобы я построил строку запроса вручную:

package main

import (
    "github.com/gocql/gocql"
    "github.com/scylladb/gocqlx"
    "github.com/scylladb/gocqlx/qb"
)

// Database setup code not shown

type SetTest struct {
    ID     string   `cql:"id"`
    myset  []string `cql:"myset"`
    mylist []string `cql:"mylist"`
}

var st SetTest

st.ID = "This is the ID"
st.myset = append(st.myset, "set2", "set1", "set3")
st.mylist = append(st.mylist, "list2", "list1", "list3")

if err := cqlSession.Query("insert into test.set_test (id, myset, mylist) values ('This is the ID', {'set2', 'set1', 'set3'}, ['mylist2', 'mylist1', 'mylist3'])").Exec(); err != nil {
    log.Fatal("set_test query values failed:", err)
}

Я надеялся использовать вместо нее вставку и привязку:

    stmt, names := qb.Insert("test.set_test").Columns("id", "myset", "mylist").ToCql()
q := gocqlx.Query(cqlSession.Query(stmt), names).BindStruct(st)

if err := q.ExecRelease(); err != nil {
    fmt.Println("set_test insert failed:", err)
}

Это возвращает ошибка привязки: не удалось найти имя "myset" в main.SetTest {ID: "Это идентификатор", myset: [] string {"set2", "set1", "set3"}, mylist: [] string {"list2", "list1", "list3"}} и map [string] interface {} (nil)

Я также пытался привязать отдельные поля структуры:

    if err := cqlSession.Query("insert into set_test (id, myset, mylist)").Bind(st.ID, st.myset, st.mylist).Exec(); err != nil {
    fmt.Println("set_test query bind(st.id) failed:", err)
}

Возвращает строка 0: -1 несоответствующий ввод '' ожидание K_VALUES q = '[оператор запроса = "INSERT INTO test.set_test (id, myset, mylist) VALUES (?,?,?) "values ​​= [] consistency = QUORUM] '

Для полноты вот описание таблицы из cqlsh:

CREATE TABLE test.set_test (
id text PRIMARY KEY,
mylist list<text>,
myset set<text>
) WITH bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
AND comment = ''
AND compaction = {'class':'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99PERCENTILE';
...