如何在gocql中插入不存在的INSERT

时间:2014-11-10 16:07:51

标签: go cassandra gocql

我一直在阅读http://godoc.org/github.com/gocql/gocql 但我不明白如何做插件 - 如果不存在与gocql。
它说明了

  

func(*查询)ScanCAS

     

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

     

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 IF NOT?你们能举个例子吗?  2.如何正确使用ScanCAS?
 3.什么使MapScanCAS和ScanCAS与众不同?我不明白what column mismatching are the author is talking about
 4.是否有任何好的页面在其godoc页面旁边解释gocql?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我的理解:

  

实际上如何在gocql中不存在时进行插入?你们能给我吗   有什么例子吗?

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

  

如何正确执行ScanCAS?

类似于问题1。

  

是什么使MapScanCAS和ScanCAS与众不同?我不明白   列不匹配是作者正在谈论的

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