如何在Cassandra 1.2 timestamp列中插入datetime

2024-05-17 06:22:20 发布

您现在位置:Python中文网/ 问答频道 /正文

重要 如果您现在正在处理此问题,请使用datastax中的新cassandra驱动程序(即import cassandra),因为它解决了大多数常见问题,不再使用旧的cql驱动程序,它已经过时了!这个问题在新驱动程序开发之前就已经过时了,我们不得不使用一个不完整的旧库cql(import cql<;——不要再使用这个,转到新驱动程序)。

简介 我正在使用python库cql访问Cassandra 1.2数据库。在数据库中,我有一个带有timestamp列的表,在Python代码中,我有一个datetime要插入到列中。示例如下:

表格

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时间戳列中的情况下,正确的方法是什么?

提前谢谢!


Tags: 代码testimportid数据库datetime驱动程序dict
3条回答

abhi已经声明可以使用epoch之后的毫秒作为cqlsh中的一个长值,现在我们需要在Python代码中使用它。

当使用cql库时,此转换(从datetime到毫秒since epoch)不会发生,因此为了使更新工作并且仍然具有将datetime转换为毫秒since 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)

您可以将datetime转换为一个长值,该值包含自epoch以来的毫秒数,也就是说,更新将使用长值作为时间戳转换为等效的表单。

希望能帮助别人

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

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

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

对我来说它直接和

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))

相关问题 更多 >