英文:
Scanning into struct of gorm query
问题
我正在尝试将查询结果扫描到一个res结构中。
代码构建成功,查询也通过了,但是结果数组中包含了默认值,如下所示:
[{0 0 0} {0 0 0} {0 0 0} {0 0 0} {0 0 0} {0 0 0}]
此外,结果数组的长度与查询结果应该具有的长度完全相同。
当我在Postgres shell中尝试生成的查询时,返回的结果是正确的。
代码:
type res struct{
id int
number int
user_id int
}
func getDataJoin(){
new := []res{}
db.Db.Table("users").Select("users.id as id, credit_cards.number as number, credit_cards.user_id as user_id").Joins("left join credit_cards on credit_cards.user_id = users.id").Scan(&new)
fmt.Println("user\n",new)
}
生成的查询:
SELECT users.id as id, credit_cards.number as number, credit_cards.user_id as user_id FROM "users" left join credit_cards on credit_cards.user_id = users.id
数据库结果:
id | number | user_id
----+--------+---------
1 | 1 | 1
1 | 2 | 1
2 | 1 | 2
2 | 2 | 2
3 | 1 | 3
3 | 2 | 3
(6 rows)
英文:
I'm trying to scan the result of a query into a res structure.
The code builds and the query passes but the result array consists of default values like this:
> [{0 0 0} {0 0 0} {0 0 0} {0 0 0} {0 0 0} {0 0 0}]
Also, result array has the exact length as the query result should have.
When i try generated query in postgres shell it returns the result correctly.
Code:
type res struct{
id int
number int
user_id int
}
func getDataJoin(){
new := []res{}
db.Db.Table("users").Select("users.id as id, credit_cards.number as number, credit_cards.user_id as user_id").Joins("left join credit_cards on credit_cards.user_id = users.id").Scan(&new)
fmt.Println("user\n",new)
}
Generated Query:
SELECT users.id as id, credit_cards.number as number, credit_cards.user_id as user_id FROM "users" left join credit_cards on credit_cards.user_id = users.id
Database result
id | number | user_id
----+--------+---------
1 | 1 | 1
1 | 2 | 1
2 | 1 | 2
2 | 2 | 2
3 | 1 | 3
3 | 2 | 3
(6 rows)
答案1
得分: 9
由于go-gorm在命名方面有一定的约定,您可能想尝试两件事。
第一种方法是将您的res
结构体公开,并使用公共字段:
type Res struct{
ID int
Number int
UserID int
}
第二种方法是指定列和字段之间的映射关系:
type res struct{
id int `gorm:"column:id"`
number int `gorm:"column:number"`
user_id int `gorm:"column:user_id"`
}
英文:
Since go-gorm has a certain convention when it comes to naming, you might want to try two things.
Make your res
struct publicly available, with public fields:
type Res struct{
ID int
Number int
UserID int
}
Or, specify mappings between columns and fields:
type res struct{
id int `gorm:"column:id"`
number int `gorm:"column:number"`
user_id int `gorm:"column:user_id"`
}
答案2
得分: 1
gorm
只能读取/写入导出字段,就像json
包的Marshal
/Unmarshal
方法一样。如果字段的第一个字母是大写的,它将被使用。默认情况下,gorm
将结构体字段与其驼峰形式进行匹配。您还可以定义自己的列名。
由于ID
和Id
的驼峰形式都是id
,只要字段的第一个字母是大写的,它就应该工作。另外,写ID
,即两个字母都大写,是一个好的做法。
英文:
gorm
can only read/write on exported fields much like Marshal
/Unmarshal
methods of json
package. If the first letter of your field is in capital, it will be used. By default, gorm
matches struct fields with their camel-cased forms. You can also define your own column names.
Since camel-cased form of both ID
and Id
, is id
, as long as the first letter of your field is in capital, it should work. On a different note, it's good practice to write ID
, i.e., both letter capital.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论