根据您提供的需求,以下是一个使用 GORM 操作数据库的示例代码,用于按照树形结构管理 NginxResourceGroup
节点的增删改查:
首先,需要定义数据库模型并创建对应的表:
type NginxResourceGroup struct {
ID int `gorm:"primary_key"`
Pid int
Name string
Remarks string
State int
Children []int `gorm:"-"`
}
// 创建表
func migrate(db *gorm.DB) {
db.AutoMigrate(&NginxResourceGroup{})
}
接下来,我们可以实现节点的增删改查功能:
// 根据ID查询节点及其子节点(递归)
func findNodeWithChildren(db *gorm.DB, id int) (NginxResourceGroup, error) {
var node NginxResourceGroup
if err := db.Where("id = ?", id).First(&node).Error; err != nil {
return node, err
}
db.Model(&node).Where("pid = ?", id).Find(&node.Children)
for i := range node.Children {
child, _ := findNodeWithChildren(db, node.Children[i])
node.Children[i] = child.ID
}
return node, nil
}
// 新增节点并进行校验和维护树形结构关系
func insertNode(db *gorm.DB, node NginxResourceGroup) error {
if node.Pid != 1 && !isParentExist(db, node.Pid) {
return errors.New("Invalid parent ID")
}
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Create(&node).Error; err != nil {
tx.Rollback()
return err
}
if node.Pid != 1 {
parent := NginxResourceGroup{}
tx.First(&parent, node.Pid)
parent.Children = append(parent.Children, node.ID)
tx.Save(&parent)
}
tx.Commit()
return nil
}
// 删除节点及其子节点(递归)
func deleteNode(db *gorm.DB, id int) error {
node, err := findNodeWithChildren(db, id)
if err != nil {
return err
}
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if node.Pid == 1 {
// 删除所有已插入的节点
if err := tx.Delete(NginxResourceGroup{}, "id > ?", 1).Error; err != nil {
tx.Rollback()
return err
}
} else {
if err := tx.Where("id = ?", id).Delete(NginxResourceGroup{}).Error; err != nil {
tx.Rollback()
return err
}
parent := NginxResourceGroup{}
tx.First(&parent, node.Pid)
for i := range parent.Children {
if parent.Children[i] == id {
parent.Children = append(parent.Children[:i], parent.Children[i+1:]...)
break
}
}
// 更新父节点的子节点列表
tx.Save(&parent)
}
tx.Commit()
return nil
}
// 查询根节点及其子节点(整棵树)
func getTree(db *gorm.DB) ([]NginxResourceGroup, error) {
var rootNode NginxResourceGroup
if err := db.First(&rootNode, 1).Error; err != nil {
return nil, err
}
db.Model(&rootNode).Where("pid = ?", 1).Find(&rootNode.Children)
for i := range rootNode.Children {
child, _ := findNodeWithChildren(db, rootNode.Children[i])
rootNode.Children[i] = child.ID
}
tree := []NginxResourceGroup{rootNode}
return tree, nil
}
通过使用这些函数,您可以对树形结构中的节点进行增删改查操作,并确保维护树形结构的正确性。请注意,上述代码仅为示例,并不包含完整的错误处理和连接数据库的部分,请根据您自己的需求进行适当调整和修改。
内容由零声教学AI助手提供,问题来源于学员提问