
【第9回】Go言語(Golang)入門~ObjectBox導入編~
2021.12.20
第9回~Go言語(Golang)入門~

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

- 新潟生まれ新潟育ち本業はモバイルアプリエンジニア。
日々、猫(犬)エンジニアとして活躍中!
IT技術9月 20, 2023開発効率を少しだけ上げるGithubActionsの便利な使い方
IT技術4月 7, 2023【ISUCON部】ライトコードISUCON部 始動!
IT技術4月 18, 2022【Android】Webでよくみる入力Boxを手作り
IT技術1月 19, 2022【Android】SeekbarでスイッチなUIを作る