ZBLOG

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

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

  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. _ "github.com/go-sql-driver/mysql"
  6. )
  7. type NginxResourceGroup struct {
  8. ID int
  9. Pid int
  10. Name string
  11. Remarks string
  12. State int
  13. }
  14. func main() {
  15. db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/dbname")
  16. if err != nil {
  17. fmt.Println(err)
  18. return
  19. }
  20. defer db.Close()
  21. rows, err := db.Query("SELECT id, pid, name, remarks, state FROM nginx_resource_group")
  22. if err != nil {
  23. fmt.Println(err)
  24. return
  25. }
  26. defer rows.Close()
  27. nodes := make(map[int]*NginxResourceGroup)
  28. for rows.Next() {
  29. node := new(NginxResourceGroup)
  30. err = rows.Scan(&node.ID, &node.Pid, &node.Name, &node.Remarks, &node.State)
  31. if err != nil {
  32. fmt.Println(err)
  33. continue
  34. }
  35. nodes[node.ID] = node
  36. if !isValidTree(nodes) {
  37. fmt.Printf("Invalid tree structure after inserting node %d\n", node.ID)
  38. delete(nodes, node.ID)
  39. }
  40. }
  41. rootNode := findRootNode(nodes)
  42. if rootNode == nil {
  43. fmt.Println("No root node found in the database.")
  44. return
  45. }
  46. fmt.Println("Tree structure:")
  47. printTree(rootNode, 0, nodes)
  48. }
  49. func isValidTree(nodes map[int]*NginxResourceGroup) bool {
  50. for _, node := range nodes {
  51. parent := nodes[node.Pid]
  52. if parent == nil && node.Pid != 0 {
  53. return false
  54. }
  55. }
  56. return true
  57. }
  58. func findRootNode(nodes map[int]*NginxResourceGroup) *NginxResourceGroup {
  59. for _, node := range nodes {
  60. if node.Pid == 0 {
  61. return node
  62. }
  63. }
  64. return nil
  65. }
  66. func printTree(node *NginxResourceGroup, level int, nodes map[int]*NginxResourceGroup) {
  67. fmt.Printf("%s%s (ID: %d)\n", getIndent(level), node.Name, node.ID)
  68. for id, child := range nodes {
  69. if child.Pid == node.ID && id != node.ID { // Avoid cyclic dependencies
  70. printTree(child, level+1, nodes)
  71. }
  72. }
  73. }
  74. func getIndent(level int) string {
  75. indent := ""
  76. for i := 0; i < level; i++ {
  77. indent += " "
  78. }
  79. return indent
  80. }

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

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?