Я пытаюсь вставить фрагмент 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';