在BoltDB中,可以在嵌套的桶(bucket)下创建另一个嵌套的桶。

huangapple go评论126阅读模式
英文:

Can I have nested bucket under a nested bucket in boltdb?

问题

这是我需要创建嵌套桶的代码。它没有返回任何错误,但在创建嵌套桶时失败。

  1. func CreateNestedBuckets(buckets []string) error {
  2. err := db.Update(func(tx *bolt.Tx) error {
  3. var bkt *bolt.Bucket
  4. var err error
  5. first := true
  6. for _, bucket := range buckets {
  7. log.Error(bucket)
  8. if first == true {
  9. bkt, err = tx.CreateBucketIfNotExists([]byte(bucket))
  10. first = false
  11. } else {
  12. bkt, err = bkt.CreateBucketIfNotExists([]byte(bucket))
  13. }
  14. if err != nil {
  15. log.Error("error creating nested bucket")
  16. return err
  17. }
  18. }
  19. return nil
  20. })
  21. if err != nil {
  22. log.Error("error creating nested bucket!!!")
  23. return err
  24. }
  25. return nil
  26. }

请注意,这是一个示例代码,其中使用了一些未定义的变量和函数。你需要根据你的实际情况进行适当的修改和调整。

英文:

This is what I have to create nested buckets. It does not return any error but fails at creating nested bucket under another nested bucket.

  1. func CreateNestedBuckets(buckets []string) error {
  2. err := db.Update(func(tx *bolt.Tx) error {
  3. var bkt *bolt.Bucket
  4. var err error
  5. first := true
  6. for _, bucket := range buckets {
  7. log.Error(bucket)
  8. if first == true {
  9. bkt, err = tx.CreateBucketIfNotExists([]byte(bucket))
  10. first = false
  11. } else {
  12. bkt, err = bkt.CreateBucketIfNotExists([]byte(bucket))
  13. }
  14. if err != nil {
  15. log.Error("error creating nested bucket")
  16. return err
  17. }
  18. }
  19. return nil
  20. })
  21. if err != nil {
  22. log.Error("error creating nested bucket!!!")
  23. return err
  24. }
  25. return nil
  26. }

答案1

得分: 3

简短回答:是的!你可以有嵌套的桶。

长回答:你的代码是可以正常工作的!以下是一些需要检查的事项:

  • 你是否检查了正确的 Bolt 数据库文件?Bolt DB 文件将会在你运行代码的目录中创建,除非你指定了绝对路径。
  • 你的输入是否包含足够的元素来创建嵌套结构?

我使用了以下设置运行了你的代码(进行了一些小的更改,但没有什么大的变动),它可以正常工作:

  1. package main
  2. import (
  3. "log"
  4. "os"
  5. "time"
  6. "github.com/boltdb/bolt"
  7. )
  8. var dbname = "test.bdb"
  9. var dbperms os.FileMode = 0770
  10. var options = &bolt.Options{Timeout: 1 * time.Second}
  11. func main() {
  12. var names []string
  13. names = append(names, "bucketOne")
  14. names = append(names, "bucketTwo")
  15. names = append(names, "bucketThree")
  16. if err := CreateNestedBuckets(names); err != nil {
  17. log.Fatal(err)
  18. }
  19. }
  20. // CreateNestedBuckets - Function to create
  21. // nested buckets from an array of Strings
  22. func CreateNestedBuckets(buckets []string) error {
  23. db, dberr := bolt.Open(dbname, dbperms, options)
  24. if dberr != nil {
  25. log.Fatal(dberr)
  26. }
  27. defer db.Close()
  28. err := db.Update(func(tx *bolt.Tx) error {
  29. var bkt *bolt.Bucket
  30. var err error
  31. first := true
  32. for _, bucket := range buckets {
  33. log.Println(bucket)
  34. if first == true {
  35. bkt, err = tx.CreateBucketIfNotExists([]byte(bucket))
  36. first = false
  37. } else {
  38. bkt, err = bkt.CreateBucketIfNotExists([]byte(bucket))
  39. }
  40. if err != nil {
  41. log.Println("error creating nested bucket")
  42. return err
  43. }
  44. }
  45. return nil
  46. })
  47. if err != nil {
  48. log.Println("error creating nested bucket!!!")
  49. return err
  50. }
  51. return nil
  52. }

要测试,你可以通过 strings 命令查看文件内容:

  1. cat test.bdb | strings
  2. bucketThree
  3. bucketTwo
  4. bucketOne

如果你使用的是 Windows,我不确定等效的命令是什么,但你可以用记事本打开文件并手动检查。虽然不会很美观,但你应该能看到桶的名称。

另外,你的错误处理会导致连续打印非常相似的消息。以下是一个稍微更清晰的解决方案:

  1. // CreateNestedBucketsNew - function to create
  2. // nested buckets from an array of Strings - my implementation
  3. func CreateNestedBucketsNew(buckets []string) (err error) {
  4. err = db.Update(func(tx *bolt.Tx) (err error) {
  5. var bkt *bolt.Bucket
  6. for index, bucket := range buckets {
  7. if index == 0 {
  8. bkt, err = tx.CreateBucketIfNotExists([]byte(bucket))
  9. } else {
  10. bkt, err = bkt.CreateBucketIfNotExists([]byte(bucket))
  11. }
  12. if err != nil {
  13. return fmt.Errorf("Error creating nested bucket [%s]: %v", bucket, err)
  14. }
  15. }
  16. return err
  17. })
  18. return err
  19. }
英文:

Short answer: yes! You can have nested buckets: https://twitter.com/boltdb/status/454730212010254336

Long answer: your code works fine! Heres some things to check though:

  • Are you checking the correct bolt database file? The botlt db file will be created in the directory you run your code from, unless you've specified an absolute path.
  • Does your input actually contain enough elements to create a nested structure?

I've ran your code with the following setup (a couple of small changes but nothing major) and it works fine:

  1. package main
  2. import (
  3. "log"
  4. "os"
  5. "time"
  6. "github.com/boltdb/bolt"
  7. )
  8. var dbname = "test.bdb"
  9. var dbperms os.FileMode = 0770
  10. var options = &bolt.Options{Timeout: 1 * time.Second}
  11. func main() {
  12. var names []string
  13. names = append(names, "bucketOne")
  14. names = append(names, "bucketTwo")
  15. names = append(names, "bucketThree")
  16. if err := CreateNestedBuckets(names); err != nil {
  17. log.Fatal(err)
  18. }
  19. }
  20. // CreateNestedBuckets - Function to create
  21. // nested buckets from an array of Strings
  22. func CreateNestedBuckets(buckets []string) error {
  23. db, dberr := bolt.Open(dbname, dbperms, options)
  24. if dberr != nil {
  25. log.Fatal(dberr)
  26. }
  27. defer db.Close()
  28. err := db.Update(func(tx *bolt.Tx) error {
  29. var bkt *bolt.Bucket
  30. var err error
  31. first := true
  32. for _, bucket := range buckets {
  33. log.Println(bucket)
  34. if first == true {
  35. bkt, err = tx.CreateBucketIfNotExists([]byte(bucket))
  36. first = false
  37. } else {
  38. bkt, err = bkt.CreateBucketIfNotExists([]byte(bucket))
  39. }
  40. if err != nil {
  41. log.Println("error creating nested bucket")
  42. return err
  43. }
  44. }
  45. return nil
  46. })
  47. if err != nil {
  48. log.Println("error creating nested bucket!!!")
  49. return err
  50. }
  51. return nil
  52. }

To test you can cat the file through the strings command:

  1. cat test.bdb | strings
  2. bucketThree
  3. bucketTwo
  4. bucketOne

If you're on Windows, I'm not sure what the equivalent command is, but you can open the file with Notepad and inspect it manually. It won't be pretty, but you should still see the name of your buckets in there.

On another note, you error handling is going to result in very similar messages being printed in succession. Here's a slightly cleaner solution you can use:

  1. // CreateNestedBucketsNew - function to create
  2. // nested buckets from an array of Strings - my implementation
  3. func CreateNestedBucketsNew(buckets []string) (err error) {
  4. err = db.Update(func(tx *bolt.Tx) (err error) {
  5. var bkt *bolt.Bucket
  6. for index, bucket := range buckets {
  7. if index == 0 {
  8. bkt, err = tx.CreateBucketIfNotExists([]byte(bucket))
  9. } else {
  10. bkt, err = bkt.CreateBucketIfNotExists([]byte(bucket))
  11. }
  12. if err != nil {
  13. return fmt.Errorf("Error creating nested bucket [%s]: %v", bucket, err)
  14. }
  15. }
  16. return err
  17. })
  18. return err
  19. }

答案2

得分: 0

fste89的演示有一些调试信息;这是正确的代码:

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/boltdb/bolt"
  6. )
  7. func CreateNestedBuckets(fatherTable string, sonTables []string) error {
  8. db, dberr := bolt.Open("your file path", 0600, &bolt.Options{Timeout: 1 * time.Second})
  9. if dberr != nil {
  10. fmt.Println(dberr)
  11. }
  12. defer db.Close()
  13. err := db.Update(func(tx *bolt.Tx) error {
  14. var bkFather *bolt.Bucket
  15. var err error
  16. bkFather, err = tx.CreateBucketIfNotExists([]byte(fatherTable))
  17. for _, ta := range sonTables {
  18. fmt.Println(ta)
  19. _, err = bkFather.CreateBucketIfNotExists([]byte(ta))
  20. if err != nil {
  21. fmt.Println("error creating nested bucket")
  22. return err
  23. }
  24. }
  25. return nil
  26. })
  27. if err != nil {
  28. fmt.Println("error creating nested bucket!!!")
  29. return err
  30. }
  31. return nil
  32. }
  33. func main() {
  34. t := []string{"cc", "1", "2", "3"}
  35. fmt.Println(CreateNestedBuckets("sb", t))
  36. }

输出结果:

  1. cc
  2. 1
  3. 2
  4. 3
  5. <nil>

可见:点击这里查看图片描述

英文:

fste89's demo has some debug;
this right:

  1. package main
  2. import (
  3. &quot;fmt&quot;
  4. &quot;time&quot;
  5. &quot;github.com/boltdb/bolt&quot;
  6. )
  7. func CreateNestedBuckets(fatherTable string, sonTabls []string) error {
  8. db, dberr := bolt.Open(&quot;your file path&quot;, 0600, &amp;bolt.Options{Timeout: 1 * time.Second})
  9. if dberr != nil {
  10. fmt.Println(dberr)
  11. }
  12. defer db.Close()
  13. err := db.Update(func(tx *bolt.Tx) error {
  14. var bkt *bolt.Bucket
  15. var err error
  16. bkFather, err = tx.CreateBucketIfNotExists([]byte(fatherTable))
  17. for _, ta := range sonTabls {
  18. fmt.Println(ta)
  19. _, err = bkFather.CreateBucketIfNotExists([]byte(ta))
  20. if err != nil {
  21. fmt.Println(&quot;error creating nested bucket&quot;)
  22. return err
  23. }
  24. }
  25. return nil
  26. })
  27. if err != nil {
  28. fmt.Println(&quot;error creating nested bucket!!!&quot;)
  29. return err
  30. }
  31. return nil
  32. }
  33. func main() {
  34. t := []string{&quot;cc&quot;, &quot;1&quot;, &quot;2&quot;, &quot;3&quot;}
  35. fmt.Println(CreateNestedBuckets(&quot;sb&quot;, t))
  36. }

echo:

  1. cc
  2. 1
  3. 2
  4. 3
  5. &lt;nil&gt;

Visible
enter image description here

答案3

得分: 0

  1. func CreateNestedBuckets(fatherTable string, sonTables []string) error {
  2. db, dberr := bolt.Open("E:\\OneDrive\\code\\go\\project\\transmission\\static\\localstorage.db", 0600, &bolt.Options{Timeout: 1 * time.Second})
  3. if dberr != nil {
  4. fmt.Println(dberr)
  5. }
  6. defer db.Close()
  7. err := db.Update(func(tx *bolt.Tx) error {
  8. var err error
  9. bkFather, err := tx.CreateBucketIfNotExists([]byte(fatherTable))
  10. for _, ta := range sonTables {
  11. fmt.Println(ta)
  12. _, err = bkFather.CreateBucketIfNotExists([]byte(ta))
  13. if err != nil {
  14. fmt.Println("error creating nested bucket")
  15. return err
  16. }
  17. }
  18. return nil
  19. })
  20. if err != nil {
  21. fmt.Println("error creating nested bucket!!!")
  22. return err
  23. }
  24. return nil
  25. }
  1. <details>
  2. <summary>英文:</summary>

func CreateNestedBuckets(fatherTable string, sonTables []string) error {
db, dberr := bolt.Open("E:\OneDrive\code\go\project\transmission\static\localstorage.db", 0600, &bolt.Options{Timeout: 1 * time.Second})
if dberr != nil {
fmt.Println(dberr)
}
defer db.Close()

  1. err := db.Update(func(tx *bolt.Tx) error {
  2. var err error
  3. bkFather, err := tx.CreateBucketIfNotExists([]byte(fatherTable))
  4. for _, ta := range sonTables {
  5. fmt.Println(ta)
  6. _, err = bkFather.CreateBucketIfNotExists([]byte(ta))
  7. if err != nil {
  8. fmt.Println(&quot;error creating nested bucket&quot;)
  9. return err
  10. }
  11. }
  12. return nil
  13. })
  14. if err != nil {
  15. fmt.Println(&quot;error creating nested bucket!!!&quot;)
  16. return err
  17. }
  18. return nil

}

  1. </details>

huangapple
  • 本文由 发表于 2016年12月15日 10:04:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/41155255.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定