2010-07-13 14 views
10

Eh, sto usandoGenera UUID per Cassandra in Python

cf.insert(uuid.uuid1().bytes_le, {'column1': 'val1'}) (pycassa)

per creare un TimeUUID per Cassandra, ma ottenere l'errore

InvalidRequestException: 
InvalidRequestException(why='UUIDs must be exactly 16 bytes') 

Non fa lavoro con

uuid.uuid1() 
uuid.uuid1().bytes 
str(uuid.uuid1()) 

entrambi.

Qual è il modo migliore per creare un TimeUUID valido da utilizzare con il flag CompareWith = "TimeUUIDType"?

Grazie,
Henrik

risposta

4

È necessario assicurarsi che lo schema della famiglia di colonne accetti l'UUID come chiave. Il tuo codice funziona con una famiglia colonna creata come (usando cassandra-cli):

create column family MyColumnFamily 
    with column_type = 'Standard' 
    and comparator = 'AsciiType' 
    and default_validation_class = 'BytesType' 
    and key_validation_class = 'TimeUUIDType'; 

Per aggiungere valori a questo CF:

import pycassa 
pool = pycassa.ConnectionPool('Keyspace1') 
cf = pycassa.ColumnFamily(pool, 'MyColumnFamily') 
cf.insert(uuid.uuid1(), {'column1': 'val1'}) 
9

Sembra che si sta utilizzando l'UUID come chiave di fila e non il nome di colonna.

Il 'compare_with: TimeUUIDType' attributo specifica che i nomi delle colonne saranno confrontati con l'utilizzo del TimeUUIDType, cioè si tells Cassandra how to sort the columns for slicing operations

Hai pensato di usare uno qualsiasi dei clienti pitone di alto livello? Per esempio. Tradedgy, Lazy Boy, Telephus o Pycassa

+0

avrei dovuto detto che io sono usig pycassa, ma sembra che devo creare io stesso i timeuuids. –

+0

stesso errore. forse è un problema con pycassa –

+1

grazie ancora. e anche per il tuo messaggio icq :) –