繁体   English   中英

GoLang GORM 循环二叉树

[英]GoLang GORM Cyclical Binary Tree

我正在尝试使用 GORM(gorm.io/gorm v1.21.9)在 GoLang(go 1.16)中 model 数据库。

我的架构的一部分包括带有 2 个可选外键的表 A,实际上每条记录只使用 1 个。 表 B 包含对表 A 的 2 个引用,例如二叉树。 表 C 是叶节点。

ERD 图 1. 实体关系图

示例用法 图 2. 示例用法

我设置了如下所示的 GORM 代码。

type A struct {
    ID   string
    BID  *string
    B    *B
    CID  *string
    C    *C
}

type B struct {
    ID       string
    LeftAID  string
    LeftA    A
    RightAID string
    RightA   A
}

type C struct {
    ID string
}

当我使用示例数据加载应用程序时,表 B 的外键始终具有 null 值。

表 B 数据

但是,表 A 对每条记录都有一个 table_b_id 值(当 table_c_id 存在时,应该是 null)。

表 A 数据

我猜想,由于表 A 具有表 B 的外键,因此它在所有情况下都使用该关联,而不是选择 right_a_id 和 left_a_id 关联。 是否有可以解决此问题的 GORM 注释,或者这是 GORM 固有的限制?

请注意,我已经删除了不相关的架构信息并使用了抽象的表/列名。

也许你应该使用Self-Referential Has One自我参照有一个像follow

type A struct {
    ID   string
    LeftID  *string
    LeftA    *A `gorm:"foreignkey:LeftID"`
    RightID *string
    RightA    *A `gorm:"foreignkey:RightID"`
    LeafID *string
    LeafA    *A `gorm:"foreignkey:LeafID"`
}

测试代码:

func main() {
    db := config.CreateMysql()
    db.AutoMigrate(&A{})
    a1 := A{ID: "a1"}
    a2 := A{ID: "a2"}
    a3 := A{ID: "a3"}
    a4 := A{ID: "a4"}
    a5 := A{ID: "a5"}

    a1.LeftA = &a2
    a1.RightA = &a3

    a4.LeafA = &a5

    db.Create(&a1)
    db.Create(&a4)
}

在数据库中是这样的: 在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM