ZBLOG

节点会保存在数据库中,不要搞额外的保存,每次增删改查操作节点,从数据库里将节点都取出来

明白了,如果节点信息保存在数据库中,您可以通过数据库查询将所有节点取出来,并使用适当的数据结构进行组织和操作。以下是一个示例代码:

package main

import (
	"database/sql"
	"fmt"

	_ "github.com/go-sql-driver/mysql"
)

type NginxResourceGroup struct {
	ID       int
	Pid      int
	Name     string
	Remarks  string
	State    int
}

func main() {
	db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/dbname")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer db.Close()

	rows, err := db.Query("SELECT id, pid, name, remarks, state FROM nginx_resource_group")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer rows.Close()

	nodes := make(map[int]*NginxResourceGroup)

	for rows.Next() {
		node := new(NginxResourceGroup)
		err = rows.Scan(&node.ID, &node.Pid, &node.Name, &node.Remarks, &node.State)
		if err != nil {
			fmt.Println(err)
			continue
		}
		
        nodes[node.ID] = node
        
        if !isValidTree(nodes) {
            fmt.Printf("Invalid tree structure after inserting node %d\n", node.ID)
            delete(nodes, node.ID)
        }
    }

    rootNode := findRootNode(nodes)
    
    if rootNode == nil {
        fmt.Println("No root node found in the database.")
        return
    }

	fmt.Println("Tree structure:")
	printTree(rootNode, 0, nodes)
}

func isValidTree(nodes map[int]*NginxResourceGroup) bool {
	for _, node := range nodes {
	    parent := nodes[node.Pid]
	    if parent == nil && node.Pid != 0 {
	        return false
	    }
	}
	
	return true
}

func findRootNode(nodes map[int]*NginxResourceGroup) *NginxResourceGroup {
    for _, node := range nodes {
        if node.Pid == 0 {
            return node
        }
    }
    
    return nil
}

func printTree(node *NginxResourceGroup, level int, nodes map[int]*NginxResourceGroup) {
	fmt.Printf("%s%s (ID: %d)\n", getIndent(level), node.Name, node.ID)

	for id, child := range nodes {
	    if child.Pid == node.ID && id != node.ID { // Avoid cyclic dependencies
	        printTree(child, level+1, nodes)
	    }
	}
}

func getIndent(level int) string {
	indent := ""
	for i := 0; i < level; i++ {
		indent += "   "
	}
	return indent
}

在此示例代码中,我们使用database/sql包来连接数据库,并执行查询语句从数据库中获取节点信息。然后,我们将这些节点保存在nodes映射中,进行树形结构的校验和打印。

请确保您根据实际的数据库配置和数据表结构修改示例代码中的连接字符串、表名和字段名称。


内容由零声教学AI助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?