iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 28
1

golang連線CQL用的package,基本上使用gocql,這是一個已經相當成熟的套件。

SCYLLA官方基於gocql,提供一個類似ORM用途的套件gocqlx,可以一起做使用。

使用方面,有點像是gorm,也還要引用mysql-driver的套件,但是引用mysql-driver只是為了使用裡面init()初始化的部分。

而我們一開始對於SCYLLA連線的建立,就是用原本的gocql,如上一篇提到的,我們必須先對cluster做連線,之後產生一個session的物件。

如果是拿官方的docker-compose.yml範例,記得要去加上port-forward,9042->9042,不然會連不到docker裡面的scylla DB喔。

簡單程式碼如下:

連線cluster,建立session

package main

import (
	"log"

	"github.com/gocql/gocql"
	"github.com/scylladb/gocqlx/v2"
)

func main() {
	cluster := gocql.NewCluster("localhost")
    
	// Wrap session on creation, gocqlx session embeds gocql.Session pointer.
	session, err := gocqlx.WrapSession(cluster.CreateSession())
	if err != nil {
		log.Fatal(err)
	}

	session.Close()
}

session建立後,我們建立一個新的KEYSPACE

execErr := session.ExecStmt(`CREATE KEYSPACE IF NOT EXISTS examples WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}`)

在examples底下,建立一個table

execErr := session.ExecStmt(`CREATE TABLE IF NOT EXISTS examples.student (
		id uuid PRIMARY KEY,
		name text,
		nick_name text,
		grade int)`)
	if execErr != nil {
		log.Fatal("create table:", err)
	}


插入一筆資料

上一篇我們提到的prepare statement,在CASSANDRA/SCYLLA 裡面,其實是屬於simple statement

除此之外,還有三種statement

  • bounded statement
  • query builder
  • batch statement

源自於CASSANDRA原本就是java寫出的,用java程式呼叫CASSANDRA,就準備了這4種statment類別,之後的python和golang承襲與沿用。

強調一下,這是『程式語言』 vs『 DB處理』的部分,單單使用cqlsh,不需要考慮這些。

gocqlx本身有提供query builder的部分,如果有習慣使用gorm的開發者,一定覺得這樣的使用方式非常的有親切感吧。

import 部分首先加上query builder

import 	"github.com/scylladb/gocqlx/v2/qb"
type Student struct {
    ID       gocql.UUID
    Name     string
    NickName string
    Grade    int
}

stmt, names := qb.Insert("examples.student").Columns("id", "name", "nick_name", "grade").ToCql()
insertSong := session.Query(stmt, names)

insertSong.BindStruct(Student{
    ID:       mustParseUUID("756716f7-2e54-6674-9a00-91dcbea6cf50"),
    Name:     "Peter Park",
    NickName: "Spider Man",
    Grade:    2,
})
if err := insertSong.ExecRelease(); err != nil {
    log.Fatal("ExecRelease() failed:", err)
}
func mustParseUUID(s string) gocql.UUID {
	u, err := gocql.ParseUUID(s)
	if err != nil {
		panic(err)
	}
	return u
}

稍微講解一下,本身gocql就有提供一些對應的型態,如UUID,這部分可以多加利用。

gocql.UUID

再來是data struct不用額外寫struct tag,只要名稱對得起來,餵進去query builder會做對應。

gocql有提供一些輔助用的method,為的是確定丟進去資料有符合格式,這點也是蠻便利的。

 gocql.ParseUUID(s)

最後再執行ExecRelease,告訴程式提交語法。

insertSong.ExecRelease()

撈出資料

stmt, name := qb.Select("examples.student").
    Columns("id", "grade", "name", "nick_name").
    ToCql()

tmp := session.Query(stmt, name)

var student []Student
tmp.Select(&student)

log.Println(student)
// [{756716f7-2e54-6674-9a00-91dcbea6cf50 Peter Park Spider Man 2}]

同樣的概念,也是組裝statement之後,再把statemnt丟到session做處理,將結果丟到我們宣告的變數來取得資料。



上一篇
Day27. prepare statement 與 Session
下一篇
Day29. 程式使用 gocqlx(2)
系列文
scylla 從零開始攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言