Как я могу сделать карты с использованием строковых полей в rethinkdb?
Я хочу изменить временные метки всего в моей таблице. Кажется, я должен быть в состоянии использовать for_each
но я не уверен как.
Основываясь на документации, я думаю, что моя функция должна возвращать объект записи. Но у меня проблемы с выполнением вещей, связанных со строками. Вот очень простой пример:
r.expr([{'time':"2014"}]).map(lambda x: datetime.strptime(x['time'],'%Y'))
Это дает мне ошибку:
TypeError: must be string, not GetField
Интересно, что следующие работы:
map(lambda x: datetime.strptime(x,'%Y'),
r.expr([{'time':"2014"}])
.map(lambda x: x['time'])
.run(conn))
Что я делаю неправильно?
1 ответ
datetime.strptime
это метод python, а не метод ReQL, поэтому вы не можете отправить его на сервер.
Когда вы звоните run
по вашему запросу драйвер сохранит вывод лямбда-функции при вызове с объектом ReQL. Когда он ударит datetime.strptime(x['time'],'%Y'))
вы получите ошибку, потому что вы звоните datetime.strptime
с недопустимым аргументом.
Если вам интересно узнать немного больше, вы можете взглянуть на: http://www.rethinkdb.com/blog/lambda-functions/
Вы, вероятно, хотите сохранить год как число. Таким образом, запрос, который вы ищете, я думаю,
r.expr([{'time':2014}]).map(lambda x: r.time(x['time'], 1, 1, '+00:00')
Если вы хотите сохранить строку, вы можете сделать
r.expr([{'time':2014}]).map(lambda x: r.time(x['time'].coerce_to("NUMBER"), 1, 1, '+00:00')