ZBLOG

go语言,一个数据库中的数据结构是这样的:type NginxResourceGroup struct { ID int//本节点数据库id Pid int//父节点数据库id Name string Remarks string State int Children []int // 子节点的数据库ID列表 },按照树形结构管理这些节点的增删改查,其根节点的id固定为1,预先设定好, 并不需要实际建立,剩余节点都在此基础上插入,每次插入要做校验,父节...

根据您提供的需求,以下是一个使用 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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=14028

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?