У меня есть 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, я могу вставить их напрямую, и если я использую «проводник данных» в панели администратора RethinkDB, мои строки будут выглядеть так:
{
...
"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()))