gpt4 book ai didi

postgresql - 在两个不同的go应用程序中来自postgres的数据查询不一致

转载 作者:行者123 更新时间:2023-12-01 21:11:22 25 4
gpt4 key购买 nike

我已经构建了两个go应用程序,例如 app1 app2 ,它们都连接到相同的postgres数据库。对于每个应用程序,我都使用gorm作为ORM。

app1 用于更新数据库, app2 是在gin中创建的API服务器,用于查询数据库中的数据。

app2 中,我在程序的开头创建了一个数据库连接池,该池在每个HTTP端点处理程序中都可以重用。在处理程序函数中,我使用gorm执行一条SQL语句并返回结果。

SQL语句的旧返回值就像
select count(*) from t_publications --returns--> 2641
当我在 app1 中插入4条新记录时,我可以在 app1 psql cli中获得正确的数据,就像
select count(*) from t_publications --returns--> 2645
但是,当我检查 app2 的API端点(执行相同的SQL语句)时,它将返回旧数据
curl localhost:8080/getPublications --returns--> 2641
如果重新启动 app2 ,则可以获取所需的正确数据。我不确定是否与连接池内的连接生命周期有关的问题,有人可以解释这个问题吗?谢谢。

- - 编辑 - -

这是我的 app2 处理函数之一

func GetOverview(db *gorm.DB) gin.HandlerFunc {
var overview Overview
// the query is just a simple select statement
err := db.Raw(dbquery.GetOverview).Scan(&overview).Error
return func(c *gin.Context) {
if err == nil {
c.JSON(http.StatusOK, gin.H{
"status": "ok",
"data": overview,
})
} else {
c.JSON(http.StatusInternalServerError, gin.H{
"status": "internal server error",
"data": err,
})
}
}
}

最佳答案

您只需在GetOverview中执行一次查询,然后在用作gin.HandlerFunc的闭包中返回该查询的结果,本质上是在注册处理程序时永远缓存查询的结果。

解决方案是将查询代码移到实际的处理程序中:

func GetOverview(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
var overview Overview
// the query is just a simple select statement
err := db.Raw(dbquery.GetOverview).Scan(&overview).Error
if err == nil {
c.JSON(http.StatusOK, gin.H{
"status": "ok",
"data": overview,
})
} else {
c.JSON(http.StatusInternalServerError, gin.H{
"status": "internal server error",
"data": err,
})
}
}
}

关于postgresql - 在两个不同的go应用程序中来自postgres的数据查询不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60594039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com