gpt4 book ai didi

go - 如何将数据库记录加载到子结构中?

转载 作者:IT王子 更新时间:2023-10-29 02:16:15 30 4
gpt4 key购买 nike

尝试使用 GO/Beego 框架并尝试查询数据库以将一些记录加载到结构中。

下面是重要的代码:

type User struct {
UserId int64 `orm:"pk"`
FirstName string `orm:"null" valid:"MinSize(2);MaxSize(150)"`
LastName string `orm:"null" valid:"MinSize(2);MaxSize(150)"`
Email string `valid:"Required;MinSize(2);MaxSize(150);Email" required:"true" description:"user email address"`
Password string `valid:"Required;MaxSize(60)" required:"true" description:"user plain text password" json:"-"`
AccessLevel uint64 `json:"-"`
AuthKey string `json:"-"`
Status int `json:"-"`
DateAdded time.Time `orm:"-" json:"-"`
LastUpdated time.Time `orm:"-" json:"-"`

// relations
Profile *UserProfile `orm:"rel(one)" json:"-"` // OneToOne relation
}

type UserProfile struct {
UserId int64 `orm:"pk"` // doesn't work without a PK, doesn't make sense, it's a fk...
Company string `orm:"null" valid:"MinSize(2);MaxSize(150)"`
VatNumber string `orm:"null" valid:"MinSize(2);MaxSize(150)"`
Website string `orm:"null" valid:"MinSize(2);MaxSize(150)"`
Phone string `orm:"null" valid:"MinSize(2);MaxSize(150);Mobile"`
Address1 string `orm:"null" valid:"MinSize(2);MaxSize(255)"`
Address2 string `orm:"null" valid:"MinSize(2);MaxSize(255)"`
City string `orm:"null" valid:"MinSize(2);MaxSize(150)"`
State string `orm:"null" valid:"MinSize(2);MaxSize(150)"`
Zip string `orm:"null" valid:"MinSize(4);MaxSize(15)"`
Country string `orm:"null" valid:"MinSize(2);MaxSize(150)"`
ConfirmationKey string `orm:"null" valid:"Length(40)" json:"-"`

// relations
User *User `orm:"reverse(one)" json:"-"` // Reverse relationship (optional)
}

func GetAllUsers() []User {
o := orm.NewOrm()
var users []User
sql := `
SELECT user.*, user_profile.*
FROM user
INNER JOIN user_profile ON user_profile.user_id = user.user_id
WHERE 1`
_, err := o.Raw(sql).QueryRows(&users)
if err != nil {
beego.Error(err)
}
beego.Info(users)
return users
}

现在上面的问题是,在调用 GetAllUsers() 时,User 的嵌入结构,即 Profile,没有得到已填充,那么我该怎么做才能使嵌入结构也被填充?

我还尝试让用户:

o.QueryTable("user").Filter("status", STATUS_ACTIVE).RelatedSel("Profile").All(&users)

它会生成如下的 sql 查询:

SELECT T0.`user_id`, T0.`first_name`, T0.`last_name`, T0.`email`, T0.`password`, T0.`access_level`, T0.`auth_key`, T0.`status`, T0.`profile_id`, T1.`user_id`, T1.`company`, T1.`vat_number`, T1.`website`, T1.`phone`, T1.`address1`, T1.`address2`, T1.`city`, T1.`state`, T1.`zip`, T1.`country`, T1.`confirmation_key` FROM `user` T0 INNER JOIN `user_profile` T1 ON T1.`user_id` = T0.`profile_id` WHERE T0.`status` = ? LIMIT 1000

而且我不知道它是从哪里想到在 profile_id 列上加入的,因为它甚至不存在,而且我不确定如何指定要加入的正确列,似乎它是从结构名称中获取的。此外,我不喜欢无法指定要选择的内容这一事实。

非常感谢任何提示,我确信这是我想念的简单的事情。

谢谢。

最佳答案

https://github.com/astaxie/beego/issues/384有相对的对话,不过是中文的。关键在下面:

type User struct {
Id int
Name string
}

type Profile struct {
Id int
Age int
}

var users []*User
var profiles []*Profile
err := o.Raw(`SELECT id, name, p.id, p.age FROM user
LEFT OUTER JOIN profile AS p ON p.id = profile_id WHERE id = ?`, 1).QueryRows(&users, &profiles)

关于go - 如何将数据库记录加载到子结构中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29035566/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com