boltdb 基礎使用

https://www.yuque.com/abs/dr4...函數

Using Store 🔔

Using Buckets

桶是鍵值對的集合。在一個桶中,鍵值惟一。
code

建立

使用 Tx.CreateBucket() 和 Tx.CreateBucketIfNotExists() 創建一個新桶(推薦使用第二個)
接受參數是 桶的名字事務

刪除

使用 Tx.DeleteBucket() 根據桶的名字來刪除作用域

例子

func main() {
    db, err := bbolt.Open("./data", 0666, nil)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    db.Update(func(tx *bbolt.Tx) error {
        b, err := tx.CreateBucketIfNotExists([]byte("MyBucket"))
        if err != nil {
            return fmt.Errorf("create bucket: %v", err)
        }
        
        if err = tx.DeleteBucket([]byte("MyBucket")); err != nil {
            return err
        }

        return nil
    })

}

Using key/value pairs 🔔

最重要的部分,就是 kv 存儲怎麼使用了,首先須要一個 桶 來存儲鍵值對。get

Put

使用 Bucket.Put() 來存儲鍵值對,接收兩個 []byte 類型的參數class

db.Update(func(tx *bolt.Tx) error {
    b := tx.Bucket([]byte("MyBucket"))
    err := b.Put([]byte("answer"), []byte("42"))
    return err
})

很明顯,上面的例子設置了 Pair: key:answer value:42date

Get

使用 Bucket.Get() 來查詢鍵值。參數是一個 []byte(別忘了此次咱們只是查詢,能夠使用 只讀事務)error

db.View(func(tx *bolt.Tx) error {
    b := tx.Bucket([]byte("MyBucket"))
    v := b.Get([]byte("answer"))
    fmt.Printf("The answer is: %s\n", v)
    return nil
})

細心會注意到,Get是不會返回 error 的,這是由於 Get() 必定能正常工做(除非系統錯誤),相應的,當返回 nil 時,查詢的鍵值對不存在。
⚠️:注意 0 長度的值 和 不存在鍵值對 的行爲是不同的。(一個返回是 nil, 一個不是)查詢

func main() {
    db, err := bolt.Open("./data.db", 0666, nil)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    err = db.Update(func(tx *bolt.Tx) error {
        b, err := tx.CreateBucketIfNotExists([]byte("MyBucket"))
        if err != nil {
            return fmt.Errorf("create bucket: %v", err)
        }

        if err = b.Put([]byte("answer"), []byte("42")); err != nil {
            return err
        }

        if err = b.Put([]byte("zero"), []byte("")); err != nil {
            return err
        }

        return nil
    })

    db.View(func(tx *bolt.Tx) error {
        b := tx.Bucket([]byte("MyBucket"))
        v := b.Get([]byte("noexists"))
        fmt.Println(reflect.DeepEqual(v, nil)) // false
        fmt.Println(v == nil)                  // true

        v = b.Get([]byte("zero"))
        fmt.Println(reflect.DeepEqual(v, nil)) // false
        fmt.Println(v == nil)                  // true
        return nil
    })
}



Delete

使用 Bucket.Delete() 刪除鍵值對db

db.View(func(tx *bolt.Tx) error {
    b := tx.Bucket([]byte("MyBucket"))
    fmt.Println(b.Get([]byte("answer")))
    
    err := b.Delete([]byte("answer"))
    if err != nil {
        return err
    }
    return nil
})

⚠️: Get() 獲取到的字節切片值只在當前事務(當前函數做用域)有效,若是要在其餘事務中使用須要使用 copy() 將其拷貝到其餘的字節切片

相關文章
相關標籤/搜索