gpt4 book ai didi

go - 我可以在 boltdb 的嵌套存储桶下嵌套存储桶吗?

转载 作者:IT老高 更新时间:2023-10-28 21:18:52 24 4
gpt4 key购买 nike

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

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
}

最佳答案

简短的回答:是的!你可以有嵌套的桶:https://twitter.com/boltdb/status/454730212010254336

长答案:您的代码运行良好!这里有一些事情要检查:

  • 您是否检查了正确的 bolt 数据库文件? 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文件:

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
}

关于go - 我可以在 boltdb 的嵌套存储桶下嵌套存储桶吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41155255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com