我在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/