【发布时间】:2020-04-29 16:11:22
【问题描述】:
我想以类似于Django's one-to-one relationships 的方式使用 GORM 的 'belongs to' association。考虑以下示例,其中每个User 与一个Profile 相关联:
package main
import (
"fmt"
"os"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
"github.com/sirupsen/logrus"
)
type User struct {
gorm.Model
Name string
}
func (user User) String() string {
return fmt.Sprintf("User(Name=%s)", user.Name)
}
type Profile struct {
gorm.Model
UserID uint
User User
Name string
}
func (profile Profile) String() string {
return fmt.Sprintf("Profile(Name=%s, User=%d)", profile.Name, profile.UserID)
}
func (user *User) AfterCreate(scope *gorm.Scope) error {
profile := Profile{
UserID: user.ID,
Name: user.Name,
}
return scope.DB().Create(&profile).Error
}
const dbName = "examplegorm.db"
func main() {
db, err := gorm.Open("sqlite3", dbName)
if err != nil {
logrus.Fatalf("open db: %v", err)
}
defer func() {
db.Close()
os.Remove(dbName)
}()
db.LogMode(true)
db.AutoMigrate(&User{})
db.AutoMigrate(&Profile{})
user := User{Name: "jinzhu"}
if err := db.Create(&user).Error; err != nil {
logrus.Fatalf("create user: %v", err)
}
var profile Profile
if err := db.Where(Profile{UserID: user.ID}).Preload("User").First(&profile).Error; err != nil {
logrus.Fatalf("get profile: %v", err)
}
logrus.Infof("profile: %v", profile)
logrus.Infof("user: %v", profile.User)
}
在此示例中,我查询 Profile 并预加载其 User。但是,我实际上想以另一种方式执行此操作:查询 User 并预加载其 Profile。
据我了解,在 Django 中,您可以同时访问 profile.user 和 user.profile,但如果我尝试将 Profile 和 ProfileID 字段添加到 User 模型,
type User struct {
gorm.Model
Name string
Profile
ProfileID uint
}
我收到“无效的递归类型”错误:
# command-line-arguments
./gorm_belongs_to.go:23:6: invalid recursive type Profile
有没有办法在这个 GORM 示例中获得 user.Profile?
【问题讨论】:
标签: go associations one-to-one go-gorm