英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论