2013-02-15 5 views
10

Próbuję wstawić zmodyfikowany dokument z powrotem do Cassandra DB z nowym kluczem. Mam problem z ustaleniem, na co wskazuje komunikat o błędzie. Szukając innych, którzy mieli podobne problemy, odpowiedzi wydają się być związane z kluczami, a w moim przypadku Brak jest tylko wartością kilku kluczy. Jak rozwiązać ten problem?Co powoduje "brak realnej alternatywy na wejściu" Brak "" z Cassandrą CQL

keys = ','.join(current.keys()) 
params = [':' + x for x in current.keys()] 
values = ','.join(params) 

query = "INSERT INTO wiki.pages (%s) Values (%s)" % (keys, values) 
query = query.encode('utf-8') 
cursor.execute(query, current) 

Oto dane dla zapytania i prądu:

INSERT INTO wiki.pages (changed,content,meta,attachment,revision,page,editor) 
VALUES (:changed,:content,:meta,:attachment,:revision,:page,:editor) 

{ 
    u'changed': '2013-02-15 16:31:49', 
    u'content': 'Testing', 
    u'meta': None, 
    u'attachment': None,  
    u'revision': 2, 
    u'page': u'FrontPage', 
    u'editor': 'Anonymous' 
} 

ten nie powiedzie się z powodu następującego błędu:

cql.apivalues.ProgrammingError: 
Bad Request: line 1:123 no viable alternative at input 'None' 

Odpowiedz

13

„nie realną alternatywą” oznacza, że ​​typ danych dla jakiegoś klucza nie pasuje do schematu dla tej kolumny rodziny kolumn, niestety nie mówi tego wprost w komunikacie o błędzie.

W moim przypadku typu danych meta była:

map<text,text> 

Żaden z tego powodu uznano za złą wartość w czasie wkładania. Naprawiłem problem zastępując Żaden z pustym dict przed wstawić:

if current['meta'] is None: 
    current['meta'] = dict() 

Kierowca CQL akceptuje pusty dict grzywny jako nowej wartości dla typu mapy, podczas gdy żaden nie jest dozwolone, mimo zapytań kolumnę mapę zwraca Brak, jeśli jest pusty.

Wracając Brak i nie akceptując Brak nie czuć intuicji, więc później postanowiłem stworzyć niestandardowe opakowanie dla cursor.fetchone(), które zwraca mapę kolumn zamiast listy kolumn, a także sprawdza, czy MapType, ListType lub SetType zwrócił Brak. Jeśli są wartości None, zastępuje je pustymi dyktami(), list() lub set(), aby uniknąć problemów takich jak ten, który miałem podczas wstawiania zmodyfikowanych danych z powrotem do Cassandry. Wydaje się to dobrze działać.

+3

FWIW, "brak realnej alternatywy" jest technicznie błędem analizy, a nie błędem typu. – jbellis

+2

Aby dodać do tego, co powiedział @jbellis, zdarza mi się to zwykle, gdy łączę ciągi znaków w wielu liniach (dla moich przygotowanych instrukcji) i zapominam o zapewnieniu miejsca po obu stronach moich identyfikatorów/słów kluczowych. Na przykład: "WYBIERZ * OD nazwa_plikuWHERE foo =?" Spowoduje "brak realnej alternatywy pod adresem: foo", ponieważ oczekiwano słowa kluczowego "WHERE", a nie identyfikatora. (Byłoby miło, gdyby wskazywało na to, czego się spodziewało). –

+1

FWIW, "nie ma realnej alternatywy" pochodzi z ANTLR, więc jeśli potrzebujesz się zagłębić, chwyć gramatykę ANTLR. – Jus12

Powiązane problemy