2016-12-15 141 views
1

這就是我必須創建嵌套桶。它不會返回任何錯誤,但無法在另一個嵌套存儲桶下創建嵌套存儲桶。我可以在boltdb中的嵌套存儲桶下嵌套存儲桶嗎?

func CreateNestedBuckets(buckets []string) error { 
err := db.Update(func(tx *bolt.Tx) error { 
    var bkt *bolt.Bucket 
    var err error 
    first := true 
    for _, bucket := range buckets { 
     log.Error(bucket) 
     if first == true { 
      bkt, err = tx.CreateBucketIfNotExists([]byte(bucket)) 
      first = false 
     } else { 
      bkt, err = bkt.CreateBucketIfNotExists([]byte(bucket)) 
     } 
     if err != nil { 
      log.Error("error creating nested bucket") 
      return err 
     } 
    } 
    return nil 
}) 
if err != nil { 
    log.Error("error creating nested bucket!!!") 
    return err 
} 
return nil 
} 
+0

我一直創建嵌套桶。這段代碼看起來應該起作用。是什麼讓你認爲後續的桶不會被創建?也許測試代碼有問題?當我遇到Go代碼的問題時,我通常使用%v或%#v爲有問題的變量引入fmt.Printf,並將其清除。 – WeakPointer

回答

2

簡答:是!你可以有嵌套桶:https://twitter.com/boltdb/status/454730212010254336

長答案:你的代碼工作正常!下面是一些需要檢查的內容:

  • 您是否正在檢查正確的螺栓數據庫文件? botlt db文件將在您運行代碼的目錄中創建,除非您指定了絕對路徑。
  • 您的輸入是否包含足夠的元素來創建嵌套結構?

我已經跑了以下設置(一對夫婦的小變化,但沒什麼大事)你的代碼,它工作正常:

package main 

import (
    "log" 
    "os" 
    "time" 

    "github.com/boltdb/bolt" 
) 

var dbname = "test.bdb" 
var dbperms os.FileMode = 0770 
var options = &bolt.Options{Timeout: 1 * time.Second} 

func main() { 
    var names []string 
    names = append(names, "bucketOne") 
    names = append(names, "bucketTwo") 
    names = append(names, "bucketThree") 

    if err := CreateNestedBuckets(names); err != nil { 
     log.Fatal(err) 
    } 
} 

// CreateNestedBuckets - Function to create 
// nested buckets from an array of Strings 
func CreateNestedBuckets(buckets []string) error { 
    db, dberr := bolt.Open(dbname, dbperms, options) 
    if dberr != nil { 
     log.Fatal(dberr) 
    } 
    defer db.Close() 

    err := db.Update(func(tx *bolt.Tx) error { 
     var bkt *bolt.Bucket 
     var err error 
     first := true 
     for _, bucket := range buckets { 
      log.Println(bucket) 
      if first == true { 
       bkt, err = tx.CreateBucketIfNotExists([]byte(bucket)) 
       first = false 
      } else { 
       bkt, err = bkt.CreateBucketIfNotExists([]byte(bucket)) 
      } 
      if err != nil { 
       log.Println("error creating nested bucket") 
       return err 
      } 
     } 
     return nil 
    }) 
    if err != nil { 
     log.Println("error creating nested bucket!!!") 
     return err 
    } 
    return nil 
} 

要測試你可以貓通過字符串的文件的命令:

cat test.bdb | strings 
bucketThree 
bucketTwo 
bucketOne 

如果您在Windows上,我不確定等效命令是什麼,但是您可以用記事本打開文件並手動檢查它。它不會很漂亮,但你仍然應該在那裏看到你的桶的名字。

另一方面,錯誤處理將導致連續打印非常類似的消息。這裏有一個稍微乾淨的解決方案,你可以使用:

// CreateNestedBucketsNew - function to create 
// nested buckets from an array of Strings - my implementation 
func CreateNestedBucketsNew(buckets []string) (err error) { 
    err = db.Update(func(tx *bolt.Tx) (err error) { 
     var bkt *bolt.Bucket 

     for index, bucket := range buckets { 
      if index == 0 { 
       bkt, err = tx.CreateBucketIfNotExists([]byte(bucket)) 
      } else { 
       bkt, err = bkt.CreateBucketIfNotExists([]byte(bucket)) 
      } 

      if err != nil { 
       return fmt.Errorf("Error creating nested bucket [%s]: %v", bucket, err) 
      } 
     } 
     return err 
    }) 
    return err 
}