如何将datetime插入cassandra1.2 timestamp列

polhcujo  于 2021-06-15  发布在  Cassandra
关注(0)|答案(5)|浏览(413)

重要提示:如果您现在正在处理此问题,请使用datastax的新cassandra驱动程序(即导入cassandra),因为它解决了大多数常见问题,不再使用旧的cql驱动程序,它已过时!这个问题在新驱动程序开发之前就已经存在了,我们不得不使用一个不完整的旧库cql(import cql<--不要再使用这个了,转到新驱动程序)。
简介我正在使用python库cql访问cassandra1.2数据库。在数据库中,我有一个带有timestamp列的表,在python代码中,我有一个要插入该列的datetime。示例如下:
table

CREATE TABLE test (
     id text PRIMARY KEY,
     last_sent timestamp
);

代码

import cql
import datetime
...
cql_statement = "update test set last_sent = :last_sent where id =:id"
rename_dict = {}
rename_dict['id'] = 'someid'
rename_dict['last_sent'] = datetime.datetime.now()
cursor.execute (cql_statement, rename_dict)

问题
当我执行代码时,实际执行的cql语句如下所示:

update test set last_sent =2013-05-13 15:12:51 where id = 'someid'

然后它失败了,出现了一个错误

Bad Request: line 1:XX missing EOF at '-05'

问题似乎是cql库在运行查询之前没有转义(“”)或转换datetime。
问题是,在不手动转义日期并能够更精确地将完整时间戳存储到cassandra timestamp列的情况下,正确的方法是什么?
提前谢谢!

sg24os4d

sg24os4d1#

大多数解决方案都是有效的,我只想建议一个更简单的方案:

from datetime import datetime

my_date = int(float(datetime.now().strftime("%s.%f"))) * 1000

update test set last_sent = my_date where id = 'someid'
mfuanj7w

mfuanj7w2#

对我来说,它直接与

update test set last_sent = '2013-05-13 15:12:51' where id = 'someid'

不需要转换一些东西。因此,在python中,可以使用datetime值作为字符串:

cursor.execute("UPDATE test SET ts=:ts WHERE id=:id;",
    dict(ts=your_datetime.isoformat(), id=id))
0md85ypi

0md85ypi3#

我可以告诉你怎么用cqlsh。试试这个

update test set last_sent =1368438171000 where id = 'someid'

日期时间的等效长值 2013-05-13 15:12:511368438171000

tjrkku2a

tjrkku2a4#

如果abhi已经声明可以使用microsellessinepoch作为cqlsh的长值,现在我们需要在python代码中使用它。
当使用cql库时,这种转换(从datetime到epoch后的毫秒数)不会发生,因此为了使更新工作并且仍然具有将datetime转换为epoch后的毫秒数所需的精度。
源代码使用了这个有用的问题:从datetime获取millis-since-epoch,特别是这个函数(注意我做的小改动):
解决方案

import datetime

def unix_time(dt):
    epoch = datetime.datetime.utcfromtimestamp(0)
    delta = dt - epoch
    return delta.total_seconds()

def unix_time_millis(dt):
    return long(unix_time(dt) * 1000.0)

对于本例,代码为:

cql_statement = "update test set last_sent = :last_sent where id =:id"
rename_dict = {}
rename_dict['id'] = 'someid'
rename_dict['last_sent'] = unix_time_millis(datetime.datetime.now())
cursor.execute (cql_statement, rename_dict)

您可以将datetime转换为一个长值,其中包含自epoch以来的毫秒数,仅此而已,使用一个长值作为时间戳将更新转换为等效形式。
希望它能帮助别人

b1zrtrql

b1zrtrql5#

我知道这是一个2年前的问题,但如果有人来寻找答案,请使用datetime示例,而不是使用timestamp。不过,python驱动程序应该巧妙地处理整数/浮点。

相关问题