ZBLOG

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

根据您提供的需求,以下是一个使用 GORM 操作数据库的示例代码,用于按照树形结构管理 NginxResourceGroup 节点的增删改查:

首先,需要定义数据库模型并创建对应的表:

  1. type NginxResourceGroup struct {
  2. ID int `gorm:"primary_key"`
  3. Pid int
  4. Name string
  5. Remarks string
  6. State int
  7. Children []int `gorm:"-"`
  8. }
  9. // 创建表
  10. func migrate(db *gorm.DB) {
  11. db.AutoMigrate(&NginxResourceGroup{})
  12. }

接下来,我们可以实现节点的增删改查功能:

  1. // 根据ID查询节点及其子节点(递归)
  2. func findNodeWithChildren(db *gorm.DB, id int) (NginxResourceGroup, error) {
  3. var node NginxResourceGroup
  4. if err := db.Where("id = ?", id).First(&node).Error; err != nil {
  5. return node, err
  6. }
  7. db.Model(&node).Where("pid = ?", id).Find(&node.Children)
  8. for i := range node.Children {
  9. child, _ := findNodeWithChildren(db, node.Children[i])
  10. node.Children[i] = child.ID
  11. }
  12. return node, nil
  13. }
  14. // 新增节点并进行校验和维护树形结构关系
  15. func insertNode(db *gorm.DB, node NginxResourceGroup) error {
  16. if node.Pid != 1 && !isParentExist(db, node.Pid) {
  17. return errors.New("Invalid parent ID")
  18. }
  19. tx := db.Begin()
  20. defer func() {
  21. if r := recover(); r != nil {
  22. tx.Rollback()
  23. }
  24. }()
  25. if err := tx.Create(&node).Error; err != nil {
  26. tx.Rollback()
  27. return err
  28. }
  29. if node.Pid != 1 {
  30. parent := NginxResourceGroup{}
  31. tx.First(&parent, node.Pid)
  32. parent.Children = append(parent.Children, node.ID)
  33. tx.Save(&parent)
  34. }
  35. tx.Commit()
  36. return nil
  37. }
  38. // 删除节点及其子节点(递归)
  39. func deleteNode(db *gorm.DB, id int) error {
  40. node, err := findNodeWithChildren(db, id)
  41. if err != nil {
  42. return err
  43. }
  44. tx := db.Begin()
  45. defer func() {
  46. if r := recover(); r != nil {
  47. tx.Rollback()
  48. }
  49. }()
  50. if node.Pid == 1 {
  51. // 删除所有已插入的节点
  52. if err := tx.Delete(NginxResourceGroup{}, "id > ?", 1).Error; err != nil {
  53. tx.Rollback()
  54. return err
  55. }
  56. } else {
  57. if err := tx.Where("id = ?", id).Delete(NginxResourceGroup{}).Error; err != nil {
  58. tx.Rollback()
  59. return err
  60. }
  61. parent := NginxResourceGroup{}
  62. tx.First(&parent, node.Pid)
  63. for i := range parent.Children {
  64. if parent.Children[i] == id {
  65. parent.Children = append(parent.Children[:i], parent.Children[i+1:]...)
  66. break
  67. }
  68. }
  69. // 更新父节点的子节点列表
  70. tx.Save(&parent)
  71. }
  72. tx.Commit()
  73. return nil
  74. }
  75. // 查询根节点及其子节点(整棵树)
  76. func getTree(db *gorm.DB) ([]NginxResourceGroup, error) {
  77. var rootNode NginxResourceGroup
  78. if err := db.First(&rootNode, 1).Error; err != nil {
  79. return nil, err
  80. }
  81. db.Model(&rootNode).Where("pid = ?", 1).Find(&rootNode.Children)
  82. for i := range rootNode.Children {
  83. child, _ := findNodeWithChildren(db, rootNode.Children[i])
  84. rootNode.Children[i] = child.ID
  85. }
  86. tree := []NginxResourceGroup{rootNode}
  87. return tree, nil
  88. }

通过使用这些函数,您可以对树形结构中的节点进行增删改查操作,并确保维护树形结构的正确性。请注意,上述代码仅为示例,并不包含完整的错误处理和连接数据库的部分,请根据您自己的需求进行适当调整和修改。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?