GORM 和外键关联

标签 go

GORM 似乎不尊重我基于外键关联表的尝试,而我的主键关联有效。

我有 3 个结构,它们与 3 个单独的数据库表相关联。它们的关系如下:

  • Inventory.CustID 与 Customer.CustID 相关(此关联有效)
  • 与 Customer.H1 相关的 GroupRules.RuleContent (这不是)

所以,我的结构是:

type Customer struct {
    CustID       sql.NullInt64  `gorm:"primary_key;Column:CUST_ACCT_ID"`
    PlanTypeCd   sql.NullString `gorm:"Column:PLAN_TYPE_CD"`
    H6           sql.NullString `gorm:"Column:H6_CUST_ACCT_NBR"`
    H1           sql.NullString `gorm:"Column:H1_CUST_ACCT_NBR"`
    AddressLine1 sql.NullString `gorm:"Column:ADDRESS_LINE_1"`
    AddressLine2 sql.NullString `gorm:"Column:ADDRESS_LINE_2"`
    City         sql.NullString `gorm:"Column:ADDRESS_CTY_NME"`
    State        sql.NullString `gorm:"Column:ADDRESS_ST_PRVN_CD"`
    Zip          sql.NullString `gorm:"Column:ADDRESS_PSTL_CD"`
    Country      sql.NullString `gorm:"Column:ADDRESS_CTRY_CD"`
}

type Inventory struct {
    CustID            sql.NullInt64  `gorm:"primary_key;Column:CUST_ACCT_ID"`
    CmpntTypeCd       sql.NullString `gorm:"Column:CMPNT_TYPE_CD"`
    AccsBdwdCd        sql.NullString `gorm:"Column:ACCS_BDWD_CD"`
    PrivateLineNumber sql.NullString `gorm:"Column:PRIVATE_LINE_NBR"`
    NtwkUsrAdr        sql.NullString `gorm:"Column:NTWK_USR_ADR"`
    Customer          Customer  `gorm:"association_foreignkey;Column:CUST_ACCT_ID"`
}

type GroupRule struct {
    RuleID           sql.NullInt64  `gorm:"primary_key;Column:RuleID"`
    RuleType         sql.NullString `gorm:"Column:RuleType"`
    RuleContent      sql.NullString `gorm:"Column:RuleContent"`
    RuleLogic        sql.NullString `gorm:"Column:RuleLogic"`
    GroupdID         sql.NullString `gorm:"Column:GroupID"`
    IsActive         sql.NullBool   `gorm:"Column:isActive"`
    LastMatchCount   sql.NullInt64  `gorm:"Column:LastMatchCount"`
    LastMatchPortIds sql.NullString `gorm:"Column:LastMatchPortIDs"`
    Creator          sql.NullInt64  `gorm:"Column:Creator"`
    ExcludeRule      sql.NullBool   `gorm:"Column:ExcludeRule"`
    Customer         Customer  `gorm:"association_foreignkey;Column:H1_CUST_ACCT_ID"`
}

然后,我的编码关系:

cust := Customer{}
inv := Inventory{}
groups := GroupRule{}

DB, e := db.DB{}
// turn on logging
DB.LogMode(true)

// Select * From customers;
DB.Find(&cust)
// gorm association between customers and inventory
DB.Model(&cust).Related(&inv, "CUST_ACCT_ID")
// gorm association between customers and group rules (does not work)
DB.Model(&cust).Related(&groups, "RuleContent")

最后一个关联不起作用。相反,它仍在尝试使用 CustomerCUST_ACCT_ID 而不是 H1_CUST_ACCT_ID 的外键来运行它的 SQL 查询。

日志输出:

// Customer/Inventory relation lookup
SELECT * FROM `Inventory`  WHERE (`CUST_ACCT_ID` = '1439457')

// Customer/GroupRule relation lookup
SELECT * FROM `FON_GroupRules`  WHERE (`RuleContent` = '1439457') 

在第二次查找中,查询应该类似于 `RuleContent = '9928332')。

谢谢!

最佳答案

刚刚碰到这个。 你最终解决了这个问题吗?

现在我认为 GroupRule 结构应该是

type GroupRule struct {
    RuleID           sql.NullInt64  `gorm:"primary_key"`
    RuleType         sql.NullString 
    RuleContent      sql.NullString 
    RuleLogic        sql.NullString 
    GroupdID         sql.NullString 
    IsActive         sql.NullBool   
    LastMatchCount   sql.NullInt64  
    LastMatchPortIds sql.NullString 
    Creator          sql.NullInt64  
    ExcludeRule      sql.NullBool   
    Customer         Customer  `gorm:"foreignKey:RuleContent;references:H1"`
}

关于GORM 和外键关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57166373/

相关文章:

parsing - 如何在 Go 中解码和编码 YAML,同时保留空白?

json - 解码 JSON 时指向接口(interface)的指针与持有指针的接口(interface)

error-handling - 为什么我不能把左大括号放在下一行?

logging - 构造系统日志消息时的乱码输出

dictionary - 如何在 map 上使用类似 ORM 的查询?

google-app-engine - 在本地 devappserver 上使用 google-api-go-client

go - `strings.split` 可以忽略空 token 吗?

pointers - 如何通过反射初始化一个空指针

docker - 在构建 docker 容器时使用本地依赖项

postgresql - 如何为 go-pg 中的每个查询动态设置表名?