【第9回】Go言語(Golang)入門~ObjectBox導入編~
IT技術
第9回~Go言語(Golang)入門~
(株)ライトコードの笹川(ささがわ)です!
前回は、Goの環境やパッケージ管理を見直していきました。
今回は、GreenRobot の ObjectBoxというデータベースを導入してみます!
それでは、いってみましょう!
前回の記事はこちら
2019.10.30【第8回】Go言語(Golang)入門~環境見直し編~第8回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です!前回は、TwitterAPI ...
ObjectBoxとは
ObjectBox とは、GreenRobot のデータベースになります。
GreenRobot は、ネイティブモバイルアプリケーションのライブラリで、馴染みがある人も多いのではないでしょうか?
ObjextBox 自体は、笹川の個人開発アプリでも利用経験があり、他のメジャーな DB と比較しても扱いやすい印象を受けたので愛用しています。
前回導入した、Firestore と同様で、NoSQL のデータベースとなります。
Firestore では、Firebaseへの認証が必要でした。
しかし、ObjectBox はローカルに置かれるデータベースになりますので、認証の手間が減るのは嬉しいですね。
ObjectBoxを導入してみよう!
それでは、以下のドキュメントを参考に進めていきましょう!
【ドキュメント】
https://golang.objectbox.io/
ObjectBoxのimportを追加
ドキュメント通りに ObjectBox の import を追加します。
1package main
2
3import (
4 "fmt"
5 "github.com/objectbox/objectbox-go/objectbox"
6)
7
8func main() {
9 fmt.Println(objectbox.VersionInfo())
10}
Go Modules が入っていれば、そのまま main.go を実行することでライブラリを導入されます。
1$ go run main.go
2ObjectBox Go version 1.0.0 using dynamic library version 0.6.0
導入した ObjectBox のバージョンが無事に出力されました!
データを追加してみよう!
まずは、データを追加するためのテーブルを定義します。
modelディレクトリを作成し、その中に task.go を作成します。
1package model
2
3//go:generate go run github.com/objectbox/objectbox-go/cmd/objectbox-gogen
4
5type Task struct {
6 Id uint64
7 Text string
8 DateCreated int64
9 DateFinished int64
10}
3行目の gogen の設定を入れておかないと、この先詰まりますので必ず入れてください。
go generateコマンドを実行
go generate コマンドを実行します。
1$ go generate ./model
2Generating ObjectBox bindings for task.go
これで、Taskテーブルの設定は完了しました。
データベースの接続からデータの追加までの記述
次に、データベースの接続からデータの追加までを main.go へ記述します。
1package main
2
3import (
4 "fmt"
5 "go_example/model"
6 "time"
7
8 "github.com/objectbox/objectbox-go/objectbox"
9)
10
11func main() {
12 // initialize
13 ob := initObjectBox()
14 defer ob.Close()
15
16 // テーブル呼び出し
17 box := model.BoxForTask(ob)
18
19 // データ追加
20 box.Put(&model.Task{
21 Text: "タスク",
22 DateCreated: time.Now().Unix(),
23 })
24}
25
26func initObjectBox() *objectbox.ObjectBox {
27 objectBox, _ := objectbox.NewBuilder().Model(model.ObjectBoxModel()).Build()
28 return objectBox
29}
これで実行し、エラーが出なければ、データ追加は成功です。
デバッグログ
1$ go run main.go
2001-03:27:59.4689 [DEBUG] Current directory when opening store: /Users/sasagawanoriyuki/development/go/src/go_example
3
4001-03:27:59.4695 [DEBUG] ObjectBox 2.4.0-2019-06-26 (64 bit mode)
5001-03:27:59.4695 [DEBUG] Opening DB "objectbox" (max 1048576 KB, mode 755)...
6001-03:27:59.4709 [DEBUG] Opened database objectbox
7001-03:27:59.4722 [DEBUG] Wrote 1 entities to schema
8001-03:27:59.4725 [DEBUG] TX #1 committed
9001-03:27:59.4725 [DEBUG] Closing database
10001-03:27:59.4728 [DEBUG] Current directory when opening store: /Users/sasagawanoriyuki/development/go/src/go_example
11
12001-03:27:59.4728 [DEBUG] Opening DB "objectbox" (max 1048576 KB, mode 755)...
13001-03:27:59.4738 [DEBUG] Opened database objectbox
14001-03:27:59.4739 [DEBUG] Read 1 entity type(s)
15001-03:27:59.4739 [DEBUG] Store set up in 5.07 ms
16002-03:27:59.4744 [DEBUG] Set thread name to AsyncTxQueue
17001-03:27:59.4748 [DEBUG] TX #4 committed
18001-03:27:59.4748 [DEBUG] Closing database
デバッグログは出ましたが、エラーログは出なかったようです。
データの読み取り
データを読み取ってみましょう。
1package main
2
3import (
4 "fmt"
5 "go_example/model"
6 "time"
7
8 "github.com/objectbox/objectbox-go/objectbox"
9)
10
11func main() {
12 // initialize
13 ob := initObjectBox()
14
15 defer ob.Close()
16
17 // テーブル呼び出し
18 box := model.BoxForTask(ob)
19
20 // データ全件取得
21 var list []*model.Task
22 list, _ = box.GetAll()
23 for _, task := range list {
24 fmt.Println(task.Text)
25 fmt.Println(task.Id)
26 fmt.Println(time.Unix(task.DateCreated, 0))
27 }
28}
デバッグログをgrepで除外
デバッグログがあると結果が見えづらいので、grep で除外して実行します。
1$ go run main.go | grep -v "DEBUG"
2タスク
31
42019-10-02 12:27:59 +0900 JST
最初に追加した1件のみ、あることを確認できました!
データを更新してみよう!
追加したデータの Text の内容を更新します。
1package main
2
3import (
4 "fmt"
5 "go_example/model"
6 "time"
7
8 "github.com/objectbox/objectbox-go/objectbox"
9)
10
11func main() {
12 // initialize
13 ob := initObjectBox()
14
15 defer ob.Close()
16
17 // テーブル呼び出し
18 box := model.BoxForTask(ob)
19
20 task, _ := box.Get(1)
21 task.Text += " 更新しちゃったよ"
22 box.Put(task)
23
24 // データ全件取得
25 var list []*model.Task
26 list, _ = box.GetAll()
27 for _, task := range list {
28 fmt.Println(task.Text)
29 fmt.Println(task.Id)
30 fmt.Println(time.Unix(task.DateCreated, 0))
31 }
32}
実行
それでは、実行してみましょう。
1$ go run main.go | grep -v "DEBUG"
2タスク 更新しちゃったよ
31
42019-10-02 12:27:59 +0900 JST
データの更新に成功しました!
データを削除してみよう!
今回は、IDを指定し、削除してみようと思います。
現在、保存されているデータのIDは「1」なので、「1」を指定します。
1package main
2
3import (
4 "fmt"
5 "go_example/model"
6 "time"
7
8 "github.com/objectbox/objectbox-go/objectbox"
9)
10
11func main() {
12 // initialize
13 ob := initObjectBox()
14
15 defer ob.Close()
16
17 // テーブル呼び出し
18 box := model.BoxForTask(ob)
19
20 // 数を確認
21 preCount , _ := box.Count()
22 fmt.Println("削除前: " + fmt.Sprint(preCount))
23
24 // IDが1のデータを取得
25 task, _ := box.Get(1)
26 box.Remove(task)
27
28 // 数を確認
29 postCount , _ := box.Count()
30 fmt.Println("削除後: " + fmt.Sprint(postCount))
31}
ログ出力
ログで確認するために、レコードの数をログ出力させます。
1$ go run main.go | grep -v "DEBUG"
2削除前: 1
3削除後: 0
問題なく削除できたようです!
データを検索してみよう!
データを複数個追加し、データを1個だけ抽出するようにしてみます。
1package main
2
3import (
4 "fmt"
5 "go_example/model"
6 "time"
7
8 "github.com/objectbox/objectbox-go/objectbox"
9)
10
11func main() {
12 // initialize
13 ob := initObjectBox()
14
15 defer ob.Close()
16
17 // テーブル呼び出し
18 box := model.BoxForTask(ob)
19
20 // 10件タスクを追加する
21 for i := 0; i < 10; i++ {
22 box.Put(&model.Task{
23 Text: "タスク" + fmt.Sprint(i),
24 DateCreated: time.Now().Unix(),
25 })
26 }
27
28 // データ全件取得
29 var list []*model.Task
30 list, _ = box.GetAll()
31 for _, task := range list {
32 fmt.Println(task.Text)
33 }
34 fmt.Println("***ここからクエリ***")
35 // タスク5だけ検索
36 query := box.Query(model.Task_.Text.Equals("タスク5", true))
37 tasks, _ := query.Find()
38 for _, task := range tasks {
39 fmt.Println(task.Text)
40 fmt.Println(task.Id)
41 fmt.Println(time.Unix(task.DateCreated, 0))
42 }
43
44}
ログ出力
これで実行すると、タスクが10個追加され、Text がタスク5のものだけ、IDなどをログ出力します。
1$ go run main.go | grep -v "DEBUG"
2タスク0
3タスク1
4タスク2
5タスク3
6タスク4
7タスク5
8タスク6
9タスク7
10タスク8
11タスク9
12***ここからクエリ***
13タスク5
146
152019-10-02 14:01:29 +0900 JST
検索も簡単にできました!
第10回へつづく!
今回は、ObjectBoxの導入と、データの操作についてやってみました。
軽量高速のObjectBoxは、モバイル向けとして開発されましたが、今では様々な言語でも利用できるようになってきています。
この機会に皆様も触ってみてはいかがでしょうか!
なお、今回作成したgoファイルは、こちらのリポジトリにて管理しています。
次回の記事はこちら
オススメのGo入門本
こちらの記事もオススメ!
2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
第1回の記事はこちら
2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
新潟生まれ新潟育ち本業はモバイルアプリエンジニア。 日々、猫(犬)エンジニアとして活躍中!