预期此代码结果为null
,但我不是null。rDB.Where("user_id = ? AND updated_at > ?", userID, date).Find(&onedays)
date := "2018-01-04 23:18:00"
,并且Onedays
表中有一些记录。
+----+---------+------------+------------+---------------------+
| id | user_id | save_state | date | updated_at |
+----+---------+------------+------------+---------------------+
| 1 | 44 | 0 | 1514214001 | 2018-01-04 21:25:05 |
| 2 | 44 | 0 | 1514214001 | 2018-01-04 22:07:55 |
| 3 | 15 | 1 | 1514300400 | 2018-01-04 23:17:49 |
+----+---------+------------+------------+---------------------+
返回的代码是:
{
"onedays": [
{
"id": 1,
"user_id": 44,
"save_state": false,
"date": 1514214001,
"updated_at": "2018-01-04T21:25:05+09:00"
},
{
"id": 2,
"user_id": 44,
"save_state": false,
"date": 1514214001,
"updated_at": "2018-01-04T22:07:55+09:00"
}
],
"photos": null
}
但是我执行这个查询,返回为空。
SELECT * FROM Onedays WHERE user_id = 44 AND updated_at > '2018-01-04 23:18:00'
也许是由于gorm设置导致的。
我该如何解决这个问题?
UPDATE粘贴功能代码
func getDiff(userID, date string) interface{} {
var wg sync.WaitGroup
var onedays []model.OnedayDiff
var photos []model.PhotoDiff
var resPhotos []model.PhotoDiff
_, rDB := lib.DB()
rDB.Where("user_id = ? AND updated_at > ?", userID, date).Find(&onedays)
funcs := []func(){
// Photo
func() {
rDB.Where("user_id = ?", userID).Find(&onedays)
for _, v := range onedays {
rDB.Where("oneday_id = ? AND updated_at > ?", v.ID, date).Find(&photos)
resPhotos = append(resPhotos, photos...)
}
},
}
for _, sleep := range funcs {
wg.Add(1)
go func(function func()) {
defer wg.Done()
function()
}(sleep)
}
wg.Wait()
return map[string]interface{}{
"onedays": onedays,
"photos": resPhotos,
}
}
photos
是正确的。 onedays
不正确... 最佳答案
这里:
func() {
rDB.Where("user_id = ?", userID).Find(&onedays)
for _, v := range onedays {
rDB.Where("oneday_id = ? AND updated_at > ?", v.ID, date).Find(&photos)
resPhotos = append(resPhotos, photos...)
}
},
您在第二行中重新使用了片段
onedays
,因此它不再为空。在第四行中,您正在异步写入photos
,这会导致数据争用,并且如果有多个goroutine,它们就会混乱。您应该在func中重新声明两个数组:
func() {
var onedays []model.OnedayDiff
var photos []model.PhotoDiff
//other codes
}