1

这就是我必须创建嵌套桶的内容。它不会返回任何错误,但无法在另一个嵌套存储桶下创建嵌套存储桶。

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
}
4

3 回答 3

3

简短的回答:是的!你可以有嵌套的桶: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
}

要测试,您可以通过 strings 命令对文件进行分类:

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
}
于 2016-12-15T09:28:08.943 回答
0

fste89的demo有一些debug;这个权利:

package main

import (
    "fmt"
    "time"

    "github.com/boltdb/bolt"
)

func CreateNestedBuckets(fatherTable string, sonTabls []string) error {
    db, dberr := bolt.Open("your file path", 0600, &bolt.Options{Timeout: 1 * time.Second})
    if dberr != nil {
        fmt.Println(dberr)
    }
    defer db.Close()

    err := db.Update(func(tx *bolt.Tx) error {
        var bkt *bolt.Bucket
        var err error
        bkFather, err = tx.CreateBucketIfNotExists([]byte(fatherTable))

        for _, ta := range sonTabls {
            fmt.Println(ta)

            _, err = bkFather.CreateBucketIfNotExists([]byte(ta))

            if err != nil {
                fmt.Println("error creating nested bucket")
                return err
            }
        }
        return nil
    })
    if err != nil {
        fmt.Println("error creating nested bucket!!!")
        return err
    }
    return nil
}

func main() {
    t := []string{"cc", "1", "2", "3"}
    fmt.Println(CreateNestedBuckets("sb", t))
}

回声:

cc
1
2
3
<nil>

可见 在此处输入图像描述

于 2020-09-27T02:16:18.290 回答
0
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()

    err := db.Update(func(tx *bolt.Tx) error {
        var err error
        bkFather, err := tx.CreateBucketIfNotExists([]byte(fatherTable))

        for _, ta := range sonTables {
            fmt.Println(ta)

            _, err = bkFather.CreateBucketIfNotExists([]byte(ta))

            if err != nil {
                fmt.Println("error creating nested bucket")
                return err
            }
        }
        return nil
    })
    if err != nil {
        fmt.Println("error creating nested bucket!!!")
        return err
    }
    return nil
}
于 2020-09-27T02:22:38.363 回答