【第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)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
笹川(エンジニア)
新潟生まれ新潟育ち本業はモバイルアプリエンジニア。 日々、猫(犬)エンジニアとして活躍中!
おすすめ記事
移転したライトコード大阪オフィスを調査せよ!
広告メディア事業部
2024.04.03
日常
【GCP】BIG QUERYを触り程度に理解してみる
かねまさ(エンジニア)
2024.04.02
IT技術
【Android】Github ActionsでFirebase Test Labの実行を分散する
笹川(エンジニア)
2024.04.02
IT技術
【Next.js】App Router で使用できるキャッシュまとめ
モーリー(エンジニア)
2024.03.29
IT技術
GitHubActionsのランナーに触れてみた
こやまん(エンジニア)
2024.03.28
IT技術