我在Cassandra中有一个表,定义如下:

CREATE TABLE book.book
(
    title text PRIMARY KEY,
    amount decimal,
    available int,
    createdon timestamp
)

我试图从该表中选择*并以json格式返回值。我能够使用实现
type Book struct {
       Title       string       `json:"title"`
       Amount      inf.Dec      `json:"amount"`
       CreatedOn   time.Time    `json:"createdon"`
       Available   int          `json:"available"`
    }


 func cassandraDisplay(query string, w http.ResponseWriter) {
    cluster := gocql.NewCluster("xxxxxxxx:xxxx")
    session, _ := cluster.CreateSession()
    defer session.Close()
    iter := session.Query("SELECT * FROM book.book").Iter()
    var book Book
    for iter.Scan(&book.Title ,&book.Amount ,&book.CreatedOn,&book.Available{
           fmt.Println(book.Title , book.Amount,book.CreatedO,book.Available)
           j, ERR:= json.Marshal(&iter)
           if ERR != nil {panic(ERR)}
           //do things with j
    }
   if err := iter.Close(); err != nil {log.Fatal(err)}
}

但该要求要求动态且无需对任何信息进行硬编码;由于它是http服务,因此查询将通过url传递。

任何想法如何使它工作?

最佳答案

@迈克尔,

您可能要使用MapScan:https://godoc.org/github.com/gocql/gocql#Iter.MapScan
这是尽可能抽象的。
https://github.com/gocql/gocql/blob/master/cassandra_test.go:

...
testMap := make(map[string]interface{})
if !session.Query(`SELECT * FROM slice_map_table`).Iter().MapScan(testMap) {
        t.Fatal("MapScan failed to work with one row")
}
...

之后,您需要反映/浏览 map 内容,但这是一个不同的主题。

关于go - 在Go中从Cassandra创建json,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41250225/

10-09 18:10