1

我一直在阅读http://godoc.org/github.com/gocql/gocql 但我不明白如何插入——如果 gocql 不存在。
它表示

func (*Query) ScanCAS

func (q *Query) ScanCAS(dest ...interface{}) (应用 bool, err 错误)

ScanCAS 执行轻量级事务(即包含 IF 子句的 UPDATE 或 INSERT 语句)。如果由于现有值不匹配而导致事务失败,则先前的值将存储在 dest 中。

当我跑

cluster := gocql.NewCluster("127.0.0.1")
cluster.Keyspace = "example"
cluster.Consistency = gocql.Quorum
session, _ := cluster.CreateSession()
defer session.Close()

var mapQ map[string]interface{}
var inserted bool
var id gocql.UUID
var timeline, text string
// insert a tweet
isTrue, err := session.Query(`INSERT INTO tweet (timeline, id, text) VALUES (?, ?, ?) IF NOT EXIST`,
    "hermano", gocql.TimeUUID(), "good night").
    ScanCAS(); if err != nil {
    log.Println(err)
}
fmt.Println(timeline, id, text)
fmt.Printf("%+v\n", isTrue)
fmt.Printf("%+v\n", inserted)
fmt.Printf("%+v\n", mapQ)

我得到:
Failed parsing statement: [INSERT INTO tweet (timeline, id, text) VALUES (?, ?, ?) IF NOT EXIST] reason: ArrayIndexOutOfBoundsException -1

所以我的问题是:
1. 如果在 gocql 中不存在,如何实际执行 INSERT?你们能给我举个例子吗?
2.如何正确进行ScanCAS?
3. MapScanCAS 和 ScanCAS 有何不同?我不明白作者在说什么列不匹配
4. 除了 godoc 页面之外,还有什么好的页面可以解释 gocql 吗?

4

2 回答 2

1

我的理解:

如果在 gocql 中不存在,如何实际执行 INSERT?你们能给我举个例子吗?

由于您正在执行的 LWT 需要先从 Cassandra 读取数据并决定是否应该插入/更新该值,因此 ScanCAS 将返回 1) 是否应用了此 LWT 的更改,2) 如果未应用,则 ScanCAS 将返回现有值(s) 在卡桑德拉。因此,在 ScanCAS 中,您应该尝试读取您插入的相同类型的数据。

如何进行正确的 ScanCAS?

与问题 1 类似。

MapScanCAS 和 ScanCAS 有何不同?我不明白作者在说什么列不匹配

我认为作者的意思是很容易弄乱扫描返回值/列的顺序,所以你可以使用 MapScanCAS 来避免这个问题

于 2018-06-25T17:45:40.677 回答
0

看起来像一个错字,你应该使用“如果不存在”

于 2016-02-03T04:35:47.950 回答