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喔。
簡單程式碼如下:
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()
}
execErr := session.ExecStmt(`CREATE KEYSPACE IF NOT EXISTS examples WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}`)
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
源自於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
做處理,將結果丟到我們宣告的變數來取得資料。