• トップ
  • ブログ一覧
  • 【第9回】Go言語(Golang)入門~ObjectBox導入編~
  • 【第9回】Go言語(Golang)入門~ObjectBox導入編~

    笹川(エンジニア)笹川(エンジニア)
    2019.11.06

    IT技術

    第9回~Go言語(Golang)入門~

    秋山笹川先生

    (株)ライトコードの笹川(ささがわ)です!

    前回は、Goの環境やパッケージ管理を見直していきました。

    今回は、GreenRobot ObjectBoxというデータベースを導入してみます!

    それでは、いってみましょう!

    前回の記事はこちら

    featureImg2019.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ファイルは、こちらのリポジトリにて管理しています。

    次回の記事はこちら

    featureImg2019.11.13【第10回】Go言語(Golang)入門~ObjectBox活用編~第10回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です!今回は、前回に引き続き、Ob...

    オススメのGo入門本

    Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る
    Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る

     

    こちらの記事もオススメ!

    featureImg2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    第1回の記事はこちら

    featureImg2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...

    笹川(エンジニア)

    笹川(エンジニア)

    おすすめ記事