A simple Cassandra client in go. Currently runs against cassandra 1.2.x
Alternate go clients to consider
- https://github.com/carloscm/gossie
- https://github.com/tux21b/gocql
- Or, a go cassandra connection pooling service https://github.com/samuraisam/cassbounce
First get a working version of Thrift Go Lib . :
go get github.com/pomack/thrift4go/lib/go/src/thrift
# then install the go cass
go get github.com/araddon/cass
See full doc here: http://godoc.org/github.com/araddon/cass
CQL:
err, err1 := conn.Client.SetCqlVersion("3.0.0")
if err != nil || err1 != nil {
log.Println(err, err1)
}
res, err2 := conn.Query(`
CREATE TABLE user (
customerid int,
uid int,
gob blob,
PRIMARY KEY (customerid, uid)
);`)
if err2 != nil {
log.Println("CQL Query create failed by returning error ", err)
}
cql := fmt.Sprintf(`INSERT INTO user (customerid, uid, gob) VALUES (1234,128,'%#x');`, "gobdata")
if _, err3 := conn.Query(cql); err3 != nil {
log.Println("CQL Query Insert failed by returning error ", err3)
}
rows, err4 := conn.Query("SELECT * FROM user WHERE customerid=1234;")
if len(rows) != 1 {
log.Printf("Query failed was %v \n", rows)
}
Create a Connection, Keyspace, Column Family, Insert, Read:
import "github.com/araddon/cass", "fmt"
func main() {
cass.ConfigKeyspace("testing",[]string{"127.0.0.1:9160"}, 20 )
conn, _ = cass.GetCassConn("testing")
// since there is a pool of connections, you must checkin
defer conn.Checkin()
// 1 is replication factor, will return err if it already exists
_ = conn.CreateKeyspace("testing",1)
_ = conn.CreateCF("col_fam_name")
// if you pass 0 timestamp it will generate one
err := conn.Insert("col_fam_name","keyinserttest",map[string]string{"lastname": "golang"},0)
if err != nil {
fmt.Println("error, insert/read failed")
}
col, _ := conn.Get("col_fam_name","keyinserttest","lastname")
if col == nil && col.Value != "cassgo" {
fmt.Println("insert/get single row, single col failed: testcol - keyinserttest")
}
}
Inserting more than one row:
rows := map[string]map[string]string{
"keyvalue1": map[string]string{"col1":"val1","col2": "val2"},
"keyvalue2": map[string]string{"col1":"val1","col2": "val2"},
}
// 0 is the int64 NanoSecond timestamp, if you pass 0 it will generate
err := conn.Mutate("col_fam_name",rows,0)
// equivalent to
err := conn.Mutate("col_fam_name",rows,time.Now().UnixNano())
if err != nil {
t.Errorf("error, insert/read failed on multicol insert")
}
Counter Columns:
_ = conn.CreateCounterCF("testct")// testct is a column family name
_ = conn.Add("testct","keyinserttest",int64(9))
_ = conn.Add("testct","keyinserttest",int64(10))
ct := conn.GetCounter("testct","keyinserttest")
if ct != int64(19) {
fmt.Println("Crap, counter didn't work and equal 19", ct)
}
Get Many for column family, and row key specified return columns:
// get all columns by all, all = ct specified
// true = "reversed", start from last column
colsall, errall := conn.GetAll("col_fam_name","keyvalue1", true,1000)
// get Range (start/end) column comparator determines how start/end determined, also
// reversed (start at last row), and col limit ct
cols, err2 := conn.GetRange("col_fam_name","keyvalue1","col2","col3", false, 100)
// get specific cols
cols2, err3 := conn.GetCols("col_fam_name","keyvalue1",[]string{"col2","col4"})