Golang Go语言中为什么GORM的db.raw在SQL中用mysql as别名查询会赋空值
示例 1:结构体和 select 都是用的 as 别名,直接 get 赋值给结构体的是空值,
r.GET("/fp", utils.AuthMiddleware, func(c *gin.Context) {
username := c.MustGet(“username”).(string)
var products []struct {
Age string json:"a"
TaobaoID string json:"b"
MinPrice float64 json:"c"
TPrice int json:"d"
}
if err := db.Raw(select products.age as a,products.min_price as b,products.taobao_id as c from products join users where users.username = ?
, username).Scan(&products).Error; err != nil {
c.JSON( http.StatusInternalServerError, gin.H{“error”: “Could not retrieve user products”})
return
}
c.JSON( http.StatusOK, products)
})
[root@ctos0 routes]# curl -X GET http://localhost:8080/fp -H “Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzI2ODg1OTQsImlzcyI6ImFhYSJ9.CRiAl3SG509O2XkB-a_aXtnNcgFORZsbP_7M-580HBg”
[GIN] 2024/11/26 - 09:05:55 | 200 | 716.591µs | ::1 | GET “/fp”
[{“a”:"",“b”:"",“c”:0,“d”:0},{“a”:"",“b”:"",“c”:0,“d”:0},{“a”:"",“b”:"",“c”:0,“d”:0},{“a”:"",“b”:"",“c”:0,“d”:0},{“a”:"",“b”:"",“c”:0,“d”:0},{“a”:"",“b”:"",“c”:0,“d”:0}]
示例 2:直接使用列名赋值给结构体,sql 语句不用 as 别名,这样可以正常赋值显示数据
r.GET("/fp", utils.AuthMiddleware, func(c *gin.Context) {
username := c.MustGet(“username”).(string)
var products []struct {
Age string json:"p.age"
TaobaoID string json:"p.taobao_id"
MinPrice float64 json:"p.min_price"
TPrice int json:"pr.t_price"
}
if err := db.Raw(<br> SELECT p.age, p.min_price, p.taobao_id, pr.t_price<br> FROM user_products up<br> JOIN products p ON up.product_id = <a target="_blank" href="http://p.id" rel="nofollow noopener">p.id</a><br> JOIN prices pr ON up.t_price = pr.t_price<br> JOIN users u ON up.username = u.username<br> WHERE u.username = ?
, username).Scan(&products).Error; err != nil {
c.JSON( http.StatusInternalServerError, gin.H{“error”: “Could not retrieve user products”})
return
}
c.JSON( http.StatusOK, products)
})
[root@ctos0 routes]# curl -X GET http://localhost:8080/fp -H “Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzI2ODg1OTQsImlzcyI6ImFhYSJ9.CRiAl3SG509O2XkB-a_aXtnNcgFORZsbP_7M-580HBg”
[GIN] 2024/11/26 - 09:10:44 | 200 | 821.97µs | ::1 | GET “/fp”
[{“p.age”:“333”,“p.taobao_id”:“033”,“p.min_price”:129,“pr.t_price”:79},{“p.age”:“222”,“p.taobao_id”:“022”,“p.min_price”:129,“pr.t_price”:79}]
Golang Go语言中为什么GORM的db.raw在SQL中用mysql as别名查询会赋空值
更多关于Golang Go语言中为什么GORM的db.raw在SQL中用mysql as别名查询会赋空值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
拿 json tag 硬凑 gorm 啊…
gorm 有自己的 tag
更多关于Golang Go语言中为什么GORM的db.raw在SQL中用mysql as别名查询会赋空值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
没怎么用过😅
很强!
r.GET("/fp", utils.AuthMiddleware, func(c *gin.Context) {
username := c.MustGet(“username”).(string)
var products []struct {
Age string gorm:"column:a"
TaobaoID string gorm:"column:b"
MinPrice float64 gorm:"column:c"
TPrice int gorm:"column:d"
}
if err := db.Raw(select products.age as a,products.min_price as b,products.taobao_id as c from products join users where users.username = ?
, username).Scan(&products).Error; err != nil {
c.JSON( http.StatusInternalServerError, gin.H{“error”: “Could not retrieve user products”})
return
}
c.JSON( http.StatusOK, products)
})
[rootctos0 routes]# curl -X GET http://localhost:8080/fp -H “Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzI2ODg1OTQsImlzcyI6ImFhYSJ9.CRiAl3SG509O2XkB-a_aXtnNcgFORZsbP_7M-580HBg”
[GIN] 2024/11/26 - 11:26:53 | 200 | 821.97µs | ::1 | GET “/fp”
[{“p.age”:“333”,“p.taobao_id”:“033”,“p.min_price”:129,“pr.t_price”:79},{“p.age”:“222”,“p.taobao_id”:“022”,“p.min_price”:129,“pr.t_price”:79}]
在Go语言的GORM框架中,使用db.Raw
执行原生SQL查询时,如果遇到MySQL中的AS
别名赋值结果为空值的情况,通常可能由以下几个原因引起:
-
列名冲突:确保别名没有与表中已存在的列名冲突。如果别名与表中列名相同,可能会导致解析错误或覆盖原有数据。
-
结构体映射问题:GORM通过结构体映射数据库查询结果。如果SQL查询中的别名没有在对应的结构体中定义,GORM可能无法正确映射结果,从而导致赋值为空。确保结构体中定义了与别名相匹配的字段,并使用
gorm:"column:<别名>"
标签进行映射。 -
SQL语法错误:检查SQL语句是否正确无误,包括别名语法和整体SQL结构的正确性。错误的SQL语法可能导致查询失败,从而返回空值。
-
查询执行问题:确保SQL语句在数据库管理工具中能够正确执行并返回预期结果。有时问题可能出在SQL本身,而非GORM。
-
GORM版本差异:不同版本的GORM可能在处理原生SQL和别名方面存在差异。检查你所使用的GORM版本是否支持你的用法,或查阅相关文档和更新日志。
建议逐一排查上述可能原因,并参考GORM官方文档和社区资源,以确保正确使用db.Raw
和别名功能。