Что вызывает "нет жизнеспособной альтернативы при вводе ошибки" Нет "с Cassandra CQL

Я пытаюсь вставить модифицированный документ обратно в Cassandra DB с новым ключом. Мне сложно определить, в чем проблема, на которую указывает сообщение об ошибке. При поиске других, у которых были подобные проблемы, ответы, похоже, связаны с ключами, и в моем случае None - это всего лишь небольшое количество ключей. Как решить эту проблему?

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)

Здесь данные для запроса и тока:

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'
}

Это не выполняется со следующей ошибкой:

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

Ответ 1

"Нет жизнеспособной альтернативы" означает, что тип данных для некоторого ключа не соответствует схеме для столбца семейства столбцов, к сожалению, он явно не говорит об этом в сообщении об ошибке.

В моем случае тип данных для мета:

map<text,text> 

по этой причине ничто не считалось плохим значением во время ввода. Я исправил проблему, заменив None на пустой dict до вставки:

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

Драйвер CQL принимает пустое значение dict как новое значение для типа карты, в то время как None не разрешено, хотя запрос в столбце карты возвращает None, если он пуст.

Возврат None и не принятие None не чувствовал себя интуитивно понятным, поэтому позже я решил создать пользовательскую оболочку для cursor.fetchone(), которая возвращает таблицу столбцов вместо списка столбцов, а также проверяет, соответствуют ли MapType, ListType или SetType вернул None. Если есть значения None, он заменяет их пустыми dict(), list() или set(), чтобы избежать проблем, подобных тем, которые были у меня при вставке измененных данных обратно в Cassandra. Кажется, это работает хорошо.