重要 如果您今天正在处理这个问题,请使用datastax中的新cassandra-driver(即导入cassandra),因为它解决了大部分常见问题并且不再使用旧的cql驱动程序,它已经过时了!这个问题在新驱动程序甚至处于开发阶段之前已经过时了,我们不得不使用一个名为cql的不完整的旧库(import cql< - 不再使用它,转移到新的驱动程序)。
简介 我正在使用python库cql来访问Cassandra 1.2数据库。在数据库中,我有一个带有timestamp列的表,在我的Python代码中,我有一个要插入列的日期时间。示例如下:
表格
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库没有转义('')或在运行查询之前转换日期时间。
问题 如果不手动转义日期并且能够将更精确的完整时间戳存储到cassandra时间戳列中,这样做的正确方法是什么?
提前致谢!
答案 0 :(得分:10)
我可以告诉你如何在cqlsh中做到这一点。试试这个
update test set last_sent =1368438171000 where id = 'someid'
日期时间2013-05-13 15:12:51
的等效长值为1368438171000
答案 1 :(得分:7)
abhi已经说过这可以使用毫秒来创建,因为epoch是来自cqlsh的long值,现在我们需要让它在Python代码中工作。
当使用cql库时,这种转换(从日期时间到epoch之后的毫秒)没有发生,所以为了使更新工作并且仍然具有将日期时间转换为自纪元以来的毫秒数所需的精度。
<强>来源 使用这个有用的问题:Getting millis since epoch from datetime,特别是这个函数(请注意我所做的一点改动):
解决方案
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)
您可以将日期时间转换为包含自纪元以来的毫秒数的长值,并且全部,使用时间戳的长值将更新转换为等效表单。
希望它有助于其他人
答案 2 :(得分:5)
对我而言,它可以直接使用
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))
答案 3 :(得分:1)
大多数解决方案都是有效的,我只想提出一个更简单的解决方案:
from datetime import datetime
my_date = int(float(datetime.now().strftime("%s.%f"))) * 1000
update test set last_sent = my_date where id = 'someid'
答案 4 :(得分:1)
我知道这是一个2岁的问题,但如果有人来寻找答案,请使用日期时间实例而不是使用时间戳。不过,Python驱动程序应该巧妙地处理整数/浮点数。