如何从 GO 中的 memDB 中删除条目

How to remove an entry from memDB in GO

我正在用 github.com/hashicorp/go-memdb 做这样的事情:

// Create a sample struct
type Person struct {
    Email string
    Name  string
    Age   int
}

// Create the DB schema
schema := &memdb.DBSchema{
    Tables: map[string]*memdb.TableSchema{
        "person": &memdb.TableSchema{
            Name: "person",
            Indexes: map[string]*memdb.IndexSchema{
                "id": &memdb.IndexSchema{
                    Name:    "id",
                    Unique:  true,
                    Indexer: &memdb.StringFieldIndex{Field: "Email"},
                },
                "age": &memdb.IndexSchema{
                    Name:    "age",
                    Unique:  false,
                    Indexer: &memdb.IntFieldIndex{Field: "Age"},
                },
            },
        },
    },
}

// Create a new data base
db, err := memdb.NewMemDB(schema)
if err != nil {
    panic(err)
}

// Create a write transaction
txn := db.Txn(true)

// Insert some people
people := []*Person{
    &Person{"joe@aol.com", "Joe", 30},
    &Person{"lucy@aol.com", "Lucy", 35},
    &Person{"tariq@aol.com", "Tariq", 21},
    &Person{"dorothy@aol.com", "Dorothy", 53},
}
for _, p := range people {
    if err := txn.Insert("person", p); err != nil {
        panic(err)
    }
}

// Commit the transaction
txn.Commit()

我的问题是如何删除 joe@aol.com

通过将唯一索引字段设置为所需值的对象传递来使用 Txn.Delete

根据您的模式,唯一索引与结构 Email 字段相关联,因此将具有该字段的 Person 结构传递给 Delete(它不必是一个指针):

// new read tx
deltxn := db.Txn(true)
err = deltxn.Delete("person", Person{Email: "joe@aol.com"})

如果要删除多个条目,请使用 Txn.DeleteAll 并传递 table 名称、索引名称和过滤值。它returns删除的条目数:

deltxn = db.Txn(true)
// deleting all entries with age=30
d, err = txn.DeleteAll("person", "age", 30)
// d is 1

游乐场:https://go.dev/play/p/b-Tl5Nntdjm