如果你有著需要大量存取,或是存取byte之類的需求,
還是有著避免單點故障 追求一致性,
那麼選擇Scylla就對了,而在go內使用Scylla,就必須要知道如何使用gocql。
// Create gocql cluster.
cluster := gocql.NewCluster(hosts...)
// Wrap session on creation, gocqlx session embeds gocql.Session pointer.
session, err := gocqlx.WrapSession(cluster.CreateSession())
if err != nil {
log.Println(err)
}
上面是官方的範例,hosts內是建立起來的Scylla叢集地址,可以用字串切片([]string)的方式將地址帶進去:
hosts := []string{"127.0.0.1", "127.0.0.2"}
cluster := gocql.NewCluster(hosts...)
透過這種方式就可以建立Scylla的連線。
gocql跟表單互動的方式和上一篇MySQL的方式不太一樣,
gocql必須要先建立起該表單的metadata物件,才能跟表單互動,像下面範例這樣:
var userMetadata = table.Metadata{
Name: "user",
Columns: []string{"user_name", "password", "email"},
PartKey: []string{"user_name"},
SortKey: []string{"password"},
}
var userTable = table.New(userMetadata)
第一個name是表單名稱,再來columns是表單內的欄位,
沒先寫在metadata內的欄位,是無法互動的,
而表單內的partition key有幾個,則都需要放入PartKey裡面,
如果有sort key則是放入SortKey內。
要insert或更新資料到表單內,必須先建立起該表單的Struct,例如以下範例:
type User struct {
UserName string
Password string
Email []string
}
再來建立你要寫入的資料struct,透過query產生query物件,並執行你要進行的動作,就可以寫入資料了。
p := User{
"jim",
"qwe123",
[]string{"jim@gmail.com"},
}
q := session.Query(userTable.Insert()).BindStruct(p)
if err := q.ExecRelease(); err != nil {
log.Println(err)
}
要從表單內取出資料來,也是要透過struct,必須要填入partkey跟sortkey,再透過query進行後續動作。
p := User{
"jim",
"qwe123",
nil,
}
q := session.Query(userTable.Get()).BindStruct(p)
if err := q.GetRelease(&p); err != nil {
log.Println(err)
}
log.Println(p)
p就會印出{jim qwe123 [jim@gmail.com]},這樣就可以將你搜尋的資料填入struct內,
要使用的時候,也是從struct讀取。
如果是取多筆資料,則是改用BindMap
var users []User
q := session.Query(userTable.Select()).BindMap(qb.M{"user_name": "jim"})
if err := q.SelectRelease(&users); err != nil {
t.Fatal(err)
}
log.Println(users)
印出來會像這樣,[{Michał Matczuk [michal@scylladb.com]}],
透過這種方式,就可以對Scylla表單進行操作,讓你的資料存放在Scylla內了。