10

重要 現在この問題に対処している場合は、datastax の新しい cassandra-driver (つまり、cassandra のインポート) を使用してください。これは、この一般的な問題のほとんどを解決し、古い cql ドライバーはもう使用しないためです。この質問は、新しいドライバーが開発される前の古いものであり、cql と呼ばれる不完全な古いライブラリを使用する必要がありました (インポート cql <- これはもう使用しないで、新しいドライバーに移動してください)。

はじめに Python ライブラリcql を使用して、Cassandra 1.2 データベースにアクセスしています。データベースにはタイムスタンプ列を持つテーブルがあり、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 タイムスタンプ列に格納できますか?

前もって感謝します!

4

5 に答える 5

7

abhi は、エポックからのミリ秒を cqlsh の long 値として使用してこれを実行できると既に述べていますが、Python コードで機能させる必要があります。

cql ライブラリを使用する場合、この変換 (日時からエポック以降のミリ秒) は行われないため、更新を機能させ、日時をエポック以降のミリ秒に変換する必要がある精度を維持するには、.

ソース この便利な質問を使用して: 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)

日時を、エポックからのミリ秒数を含む long 値に変換できます。それだけで、更新はタイムスタンプに long 値を使用して同等の形式に変換されます。

それが他の誰かに役立つことを願っています

于 2013-05-14T16:06:58.487 に答える
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))
于 2013-09-19T15:15:44.900 に答える
1

2 年前の質問であることはわかっていますが、誰かが答えを探している場合は、タイムスタンプを使用する代わりに日時インスタンスを使用してください。ただし、Python ドライバーは整数/浮動小数点数をスマートに処理する必要があります。

于 2016-04-25T00:39:20.960 に答える