iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0

如果你有著需要大量存取,或是存取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

要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)
}

select

要從表單內取出資料來,也是要透過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內了。


上一篇
Day16-MySQL
下一篇
Day18-Redis
系列文
從0開始的golang web server30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言