postgresql - GORM 不会根据主键返回正确的记录
问题描述
我是 GO 的新手,我正在将我的 CRUD 应用程序从使用普通 SQL 迁移到 GORM,然后我遇到了基于主键的查询将在匹配源时返回主键和 nil 的问题,而它应该返回值/记录自己,如记录在:https ://gorm.io/docs/query.html#Retrieving-with-primary-key
我期待查询的值
postgres=# SELECT * FROM users WHERE id = 1;
id | name | age | created_at | updated_at | deleted_at | location
----+------+-----+----------------------------+------------+------------+----------
1 | Rick | 22 | 2020-09-12 11:34:14.366674 | | | Toronto
(1 row)
相反,我得到了这个
&{0xc0000c0900 <nil> 1 0xc00009f860 0}
package main
import (
"fmt"
"go-postgres/models"
"log"
"os"
"github.com/joho/godotenv"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
type user models.User
func main() {
var u user
db := loadDbSecret()
result := db.First(&u, 1)
fmt.Println(result)
}
func loadDbSecret() *gorm.DB {
err := godotenv.Load(".env")
if err != nil {
log.Fatalf("Error loading .env file")
}
db, err := gorm.Open(postgres.Open(os.Getenv("POSTGRES_URL")), &gorm.Config{})
if err != nil {
panic(err)
}
return db
}
谢谢!
解决方案
注意2件事:
- 第一个参数
out
确实是给你输出查询结果的。 - 返回值是数据库实例
*DB
,实际上不是查询结果。
您还可以阅读有关Query的官方网站:
检索单个对象
GORM 提供了 First, Take, Last 方法从数据库中检索单个对象,它在查询数据库时添加了 LIMIT 1 条件,如果没有找到记录将返回错误 ErrRecordNotFound。
// Get the first record ordered by primary key db.First(&user) // SELECT * FROM users ORDER BY id LIMIT 1; // Get one record, no specified order db.Take(&user) // SELECT * FROM users LIMIT 1; // Get last record, order by primary key desc db.Last(&user) // SELECT * FROM users ORDER BY id DESC LIMIT 1; result := db.First(&user) result.RowsAffected // returns found records count result.Error // returns error // check error ErrRecordNotFound errors.Is(result.Error, gorm.ErrRecordNotFound)
简而言之,您应该从变量u
而不是result
.
func main() {
var u user
db := loadDbSecret()
result := db.First(&u, 1)
fmt.Printf("%v\n", u)
}
推荐阅读
- javascript - 反应原生导航不显示堆栈屏幕
- ios - 我可以手动选择从响应缓存还是从 Alamofire 中的服务器获取数据?
- reactjs - 如何循环遍历 MediaStreams 数组并呈现
- python - Flask 应用程序正在从一个奇怪的路径获取资产(css、js)
- swiftui - Scaled Metric 在 Apple Watch 上不起作用?
- java - 我必须单击两次才能对其进行更新(调试时效果很好)
- c# - 通过多个元数据项查询 Azure Blob 存储的最佳方式
- java - 如何使用 Java 连接到 Google Cloud SQL 数据库
- reporting-services - 固定水平主要网格线
- javascript - JSON 结果 JavaScript 点表示法查询返回未定义