15

新しいキーを使用して、変更されたドキュメントを 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'
4

1 に答える 1

15

「実行可能な代替手段がない」とは、一部のキーのデータ型がその列ファミリーの列のスキーマと一致しないことを意味しますが、残念ながら、エラー メッセージでそれが明確に示されているわけではありません。

私の場合、メタのデータ型は次のとおりです。

map<text,text> 

このため、None は挿入時に不適切な値と見なされていました。挿入する前に None を空の辞書に置き換えることで問題を修正しました。

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

CQL ドライバーは空の dict をマップ タイプの新しい値として受け入れますが、空の場合はマップ列をクエリすると None が返されますが、None は許可されません。

None を返し、None を受け入れないことは直感的ではなかったため、後で、列のリストではなく列のマップを返し、MapType、ListType、または SetType が None を返したかどうかをチェックする、cursor.fetchone() のカスタム ラッパーを作成することにしました。 . None 値がある場合は、空の dict()、list()、または set() に置き換えて、変更されたデータを Cassandra に挿入するときに発生したような問題を回避します。これはうまくいくようです。

于 2013-02-15T15:27:42.113 に答える