使用RethinkDB和Python筛选1小时以上的项目



我有一个Python脚本,收集一些度量并将其保存到RethinkDB中。我还编写了一个小的Flask应用程序来在面板上显示数据。

现在,我需要运行一个查询来查找表中更新时间超过1小时的所有行。这就是我目前所得到的:

tzinfo = pytz.timezone('Europe/Oslo')
start_time = tzinfo.localize(datetime.now() - timedelta(hours=1))
r.table('metrics').filter( lambda m:
    m.during(start_time, r.now())
    ).run(connection)

当我尝试访问该页面时,我会收到以下错误消息:

ReqlRuntimeError: Not a TIME pseudotype: `{
"listeners":    "6469",
"time": {
    "$reql_type$":  "TIME",
    "epoch_time":   1447581600,
    "timezone": "+01:00"
    }
}` in:
    r.table('metrics').filter(lambda var_1:
        var_1.during(r.iso8601('2015-11-18T12:06:20.252415+01:00'), r.now()))

我在谷歌上搜索了一下,发现这个帖子似乎有类似的问题:https://github.com/rethinkdb/rethinkdb/issues/4827,所以我重新审视了如何向数据库中添加新行,看看这是否是问题所在:

def _fix_tz(timestamp):
    tzinfo = pytz.timezone('Europe/Oslo')        
    dt = datetime.strptime(timestamp[:-10], '%Y-%m-%dT%H:%M:%S')                 
    return tzinfo.localize(dt) 
...
for row in res:                                                              
    ... remove some data, manipulate some other data ...                                                       
    r.db('metrics',                           
         {'time': _fix_tz(row['_time']),
          ...                              
          ).run(connection)

数据收集脚本检索到的"_time"包含一些垃圾,我删除了这些垃圾,然后创建了一个datetime对象。据我从RethinkDB文档中了解,我应该能够直接插入这些内容,如果我在Rethink数据库的管理面板中使用"数据浏览器",我的行看起来是这样的:

{
    ...
    "time": Sun Oct 25 2015 00:00:00 GMT+02:00
}

更新:我做了另一个测试,创建了一个小脚本来插入数据,然后检索

import rethinkdb as r
conn = r.connect(host='localhost', port=28015, db='test')
r.table('timetests').insert({
    'time': r.now(),
    'message': 'foo!'
    }).run(conn)
r.table('timetests').insert({
    'time': r.now(),
    'message': 'bar!'
    }).run(conn)
cursor = r.table('timetests').filter(
    lambda t: t.during(r.now() - 3600, r.now())
    ).run(conn)

我仍然收到相同的错误消息:

$ python timestamps.py 
Traceback (most recent call last):
  File "timestamps.py", line 21, in <module>
    ).run(conn)
  File "/Users/tsg/.virtualenv/p4-datacollector/lib/python2.7/site-packages/rethinkdb/ast.py", line 118, in run
    return c._start(self, **global_optargs)
  File "/Users/tsg/.virtualenv/p4-datacollector/lib/python2.7/site-packages/rethinkdb/net.py", line 595, in _start
    return self._instance.run_query(q, global_optargs.get('noreply', False))
  File "/Users/tsg/.virtualenv/p4-datacollector/lib/python2.7/site-packages/rethinkdb/net.py", line 457, in run_query
    raise res.make_error(query)
rethinkdb.errors.ReqlQueryLogicError: Not a TIME pseudotype: `{
    "id":   "5440a912-c80a-42dd-9d27-7ecd6f7187ad",
    "message":  "bar!",
    "time": {
        "$reql_type$":  "TIME",
        "epoch_time":   1447929586.899,
        "timezone": "+00:00"
    }
}` in:
r.table('timetests').filter(lambda var_1: var_1.during((r.now() - r.expr(3600)), r.now()))

我终于想通了。错误在lambda表达式中。您需要在特定字段上使用.during()。如果没有,查询将尝试将整行/文档转换为时间戳

此代码有效:

cursor = r.table('timetests').filter(
    lambda t: t['time'].during(r.now() - 3600, r.now())
    ).run(conn)

相关内容

最新更新