英文:
How to handle joins with gorp?
问题
在我的一个业余项目中,我有一个这样的结构体:
type Resource struct {
Id int
ParentIds []int
Title string
Contents []byte
Resources []Resource
}
每个资源可能有一些子资源([]Resource)。我想通过使用一个类似于gorp的查询到结构体映射器来开始,但我不知道如何映射这样的查询:
SELECT r.Id, r.Title, r.Contents
FROM Resources r
LEFT OUTER JOIN Resources sub ON sub.ParentIds @> ARRAY[r.Id]::integer[]
有人能创建一个最小工作示例或指向相关文档吗?也许gorp不是这个任务的合适工具?如果有更好的替代方案,我也愿意听取建议。谢谢。
英文:
In a hobby project of mine, I have a struct like this:
type Resource struct {
Id int
ParentIds []int
Title string
Contents []byte
Resources []Resource
}
Each resource possibly has some sub-resources ([]Resource). I'd like to get started by using a query-to-struct mapper like gorp, but I don't know how I can map a query like
SELECT r.Id, r.Title, r.Contents
FROM Resources r
LEFT OUTER JOIN Resources sub ON sub.ParentIds @> ARRAY[r.Id]::integer[]
Can anyone create a minimal working example or point me to a relevant documentation? Maybe gorp isn't the right tool for the job? If there is a better alternative, I'm also open to suggestions. Thank you.
答案1
得分: 2
在 gorp 的自述文件中有一个关于 join 的示例,链接为 https://github.com/go-gorp/gorp。我认为没有内置的方法可以像你所做的那样将不同的表放入数组中。
其中 InvoicePersonView 是一个用于保存查询结果的结构体。
// 运行你的查询
query := "select i.Id InvoiceId, p.Id PersonId, i.Memo, p.FName " +
"from invoice_test i, person_test p " +
"where i.PersonId = p.Id"
// 将一个切片传递给 Select()
var list []InvoicePersonView
_, err := dbmap.Select(&list, query)
// 这应该返回 true
expected := InvoicePersonView{inv1.Id, p1.Id, inv1.Memo, p1.FName}
if reflect.DeepEqual(list[0], expected) {
fmt.Println("Woot! My join worked!")
}
英文:
There is an example of a join in the gorp readme at https://github.com/go-gorp/gorp . I don't think there is any built-in way of putting separate tables into arrays like you are doing.
Where InvoicePersonView is a struct to hold the results of the query.
// Run your query
query := "select i.Id InvoiceId, p.Id PersonId, i.Memo, p.FName " +
"from invoice_test i, person_test p " +
"where i.PersonId = p.Id"
// pass a slice to Select()
var list []InvoicePersonView
_, err := dbmap.Select(&list, query)
// this should test true
expected := InvoicePersonView{inv1.Id, p1.Id, inv1.Memo, p1.FName}
if reflect.DeepEqual(list[0], expected) {
fmt.Println("Woot! My join worked!")
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论