本記事の目的
弊社で使用しているかなり参照用のRestAPIのストレージをRedisからSurrealDBへ置き換えた際の知見を基にした記事です。
所感としてはリレーショナルなストレージとしてはフットプリントがとても軽くて割り切った運用では有用だなと感じました。SQLiteやKeyValue系のストレージと競合する印象です。
SurrealDB
Goのドライバは以下で提供されています。
https://github.com/surrealdb/surrealdb.go
以下のコードはGo1.18.4で動作確認しております。
Signin
- 認証用のメソッドです。ユーザーとパスワードを指定します。
surrealdbHost := os.Getenv("SURREALDB_HOST")
surrealdbPort := os.Getenv("SURREALDB_PORT")
if surrealdbHost == "" {
surrealdbHost = "127.0.0.1"
}
if surrealdbPort == "" {
surrealdbHost = "8000"
}
db, err := surrealdb.New(fmt.Sprintf("ws://%s/rpc", surrealdbHost))
if err != nil {
panic(err)
}
surrealdbUser := os.Getenv("SURREALDB_USER")
surrealdbPassword := os.Getenv("SURREALDB_PASSWORD")
if _, err = db.Signin(map[string]interface{}{
"user": surrealdbUser,
"pass": surrealdbPassword,
}); err != nil {
panic(err)
}
Use
- 名前空間とデータベース(スキーマ)を指定します。
Create
- レコード作成に使うメソッドになります。
- 第一引数に
{テーブル名}:{主キー}
の書式で記載します。主キーを省いた場合にはUUIDが割り当てられます。
dbRecord := map[string]string{
"zipcode": record[2],
"pref": record[6],
"city": record[7],
"town": record[8],
}
//createには作成したレコードがそのまま戻る
create, err := db.Create("zipAddress", dbRecord)
if err != nil {
panic(err)
}
Query
- レコード参照に使うメソッドになります。複雑なSELECT(ORDER BY,GROUP BY等を使う場合)はほぼこちらを使うことになると思います。
- SmartUnmarshallを使うと変換するコードを書かずに済むのでとてもスッキリ書けます。
// 郵便番号から都道府県・市区町村・町域を取得する。
res, err := surrealdb.SmartUnmarshal[[]ZipAddress](db.Con.Query(
"SELECT pref,city,town,zipcode FROM zipAddress WHERE zipcode=$zipcode ORDER BY zipcode",
map[string]interface{}{"zipcode": zipcode}))
if err != nil {
return nil, err
}
SurrealDB
SurrealDBの内部構造やSurrealQLについては下記の記事が詳しいです。