SELECT WHERE 与 updated_at 是错误的
SELECT WHERE with updated_at is wrong
预期此代码结果是 null
但我得到的不是 null。
rDB.Where("user_id = ? AND updated_at > ?", userID, date).Find(&onedays)
date := "2018-01-04 23:18:00"
并且 Onedays
table.
中有一些记录
+----+---------+------------+------------+---------------------+
| 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 |
+----+---------+------------+------------+---------------------+
return其代码为:
{
"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
}
但是我执行了这个查询,return 是空的。
SELECT * FROM Onedays WHERE user_id = 44 AND updated_at > '2018-01-04 23:18:00'
这个问题可能是gorm设置引起的。
我该如何解决这个问题?
更新粘贴的函数代码
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
不正确...
正如您在从 GORM 获得的响应中看到的那样,update_at
值包含时区(+09:00
部分),而数据库中的值没有,所以这些是要么作为 UTC
处理,要么作为数据库服务器中配置的默认时区处理。
您应该检查数据库和代码所在的主机之间的时区差异 运行。
这里:
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
,因此它不再是空的。在第 4 行中,您正在异步写入 photos
,这会导致数据竞争,并且如果有多个 goroutines 就会搞砸。
您应该在函数中重新声明两个数组:
func() {
var onedays []model.OnedayDiff
var photos []model.PhotoDiff
//other codes
}
预期此代码结果是 null
但我得到的不是 null。
rDB.Where("user_id = ? AND updated_at > ?", userID, date).Find(&onedays)
date := "2018-01-04 23:18:00"
并且 Onedays
table.
+----+---------+------------+------------+---------------------+
| 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 |
+----+---------+------------+------------+---------------------+
return其代码为:
{
"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
}
但是我执行了这个查询,return 是空的。
SELECT * FROM Onedays WHERE user_id = 44 AND updated_at > '2018-01-04 23:18:00'
这个问题可能是gorm设置引起的。
我该如何解决这个问题?
更新粘贴的函数代码
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
不正确...
正如您在从 GORM 获得的响应中看到的那样,update_at
值包含时区(+09:00
部分),而数据库中的值没有,所以这些是要么作为 UTC
处理,要么作为数据库服务器中配置的默认时区处理。
您应该检查数据库和代码所在的主机之间的时区差异 运行。
这里:
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
,因此它不再是空的。在第 4 行中,您正在异步写入 photos
,这会导致数据竞争,并且如果有多个 goroutines 就会搞砸。
您应该在函数中重新声明两个数组:
func() {
var onedays []model.OnedayDiff
var photos []model.PhotoDiff
//other codes
}