• トップ
  • ブログ一覧
  • 【第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)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    笹川(エンジニア)

    笹川(エンジニア)

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background