I've just started getting this error for multiple entities, but I'm having a nightmare pinning down how to fix it.
Last night, it happened after I added a 'has many' relationship to an existing entity. After 2 hours, I was able to solve it simply by reordering the order in which migrations were specified with db.Automigrate()`, but I'll admit theres a chance that's was an illusory fix.
Everything was fine until I just added another has many relationship to another entity and I'm getting the message again, but no amount of moving migrations around will fix it.
In both cases, the entity I added the has many relation to is NOT the one mentioned in the error message. (E.g. I added Orders[] to Customer, and the message I got was can't preload field Item for core.PurchaseOrderLine) - seemingly unrelated.
I should stress that it is DEFINITELY the addition of the has many field that causes the error - if I remove it, the error stops.
Any suggestions highly appreciated.
Comment From: jpincas
I got to the root source of this problem. Let me try to explain:
In both cases, the preload field that was failing to load was not directly inside the entity, but wrapped inside an anonymous struct, e.g.
type Line struct {
LineCommon
}
type LineCommon struct {
gorm.Model
ItemID uint
Item Item
}
This was causing the failure. Denesting fixes it:
type Line struct {
gorm.Model
ItemID uint
Item Item
}
Im not sure if thats intended behaviour - i guess not. The workaround is annoying, but not the end of the world for me.
Comment From: inliquid
It's not "anonymous" it's "embedded". You embed LineCommon into Line structure. Same behavior with GORM will be achieved by using gorm:"embedded" struct tag.
Just use this instead:
type Line struct {
LineCommon LineCommon
}
in this case you are not embedding LineCommon struct. This is normal, idiomatic, and expected result with both Go and GORM.
Comment From: jpincas
Using a named struct field wouldn't give me the functionality I want - I'll use the gorm:"embedded" tag. Thanks.
Comment From: jpincas
type Line struct {
LineCommon gorm:"embedded"
}
didn't work for me. I'm back to unnesting the fields.
Comment From: inliquid
Of course it didn't work, it's same as embedding. Read carefully.
Comment From: jpincas
I did read carefully. I'm not sure what advice you are giving me. I can't use a named field struct as I need to be able to access LineCommon's methods. I can't find any documentation for gorm:embeddedso I'm not sure what it does or where to use it.
Comment From: inliquid
The point was to explain you what is happening and how it works. This struct tag not documented, but it's easy to find in the code: https://github.com/jinzhu/gorm/blob/0fd395ab37aefd2d50854f0556a4311dccc6f45a/embedded_struct_test.go#L24
Comment From: jpincas
OK - lets try to simplify, as I think we are not understanding each other. Look at my second comment (Line/LineCommon). I have about 20 types, all structured like this - with the gorm.Model and other related fields embedded. Up until a few days ago, no problems at all. So from that, I undestand that it should 'just work', because, well, it does.
A few days ago, I added a has many relationship to one of those types, and I started getting preload errors ON ANOTHER type. I solved it by shifting around the order of the migrations. A few days later, some thing. The only way I've managed to completely solve it is by de-embedding (like the 3rd example in my comment).
I'm just trying to alert that there might be a subtle bug here, although I can completely understand that I haven't provided nearly enough information to track it down.
Comment From: Bipus
type Line struct {
LineCommon []LineCommon `gorm:"ForeignKey:ItemID"`
}
type LineCommon struct {
gorm.Model
ItemID uint
Item Item
}
Comment From: github-actions[bot]
This issue will be automatically closed because it is marked as GORM V1 issue, we have released the public testing GORM V2 release and its documents https://v2.gorm.io/docs/ already, the testing release has been used in some production services for a while, and going to release the final version in following weeks, we are still actively collecting feedback before it, please open a new issue for any suggestion or problem, thank you
Also check out https://github.com/go-gorm/gorm/wiki/GORM-V2-Release-Note-Draft for how to use the public testing version and its changelog
Comment From: Hao-Wu
@jpincas I am confronted with the exactly same trouble, do you find a solution? or else I have to DeNest the model struct, which I am trying to avoid.