4

これが私の列ファミリーの定義です:

CREATE TABLE columnfamily (column1 int PRIMARY KEY, column2 text);

CQL 3構文を使用して、python cassandra-dbapi2 1.4.0を使用してCassandra 1.1.6に接続しています。次のクエリでクエリ置換を使用したいのですが、WHERE... IN (...,...) で機能していないようです:

cql = "SELECT * FROM columnfamily WHERE column1 IN (:x) and column2 = :y;"
q = cursor.prepare_query(cql)

cursor.execute_prepared(q, {'x':(1,2,3), 'y':'abc'}

上記を試した後、次のエラーが発生しました。

Traceback (most recent call last):
  File "test_cassandra.py", line 17, in <module>
    cursor.execute_prepared(q, params)
  File "/usr/local/lib/python2.7/dist-packages/cql/cursor.py", line 89, in execute_prepared
    response = self.get_response_prepared(prepared_query, params, cl)
  File "/usr/local/lib/python2.7/dist-packages/cql/thrifteries.py", line 83, in get_response_prepared
    paramvals = prepared_query.encode_params(params)
  File "/usr/local/lib/python2.7/dist-packages/cql/query.py", line 60, in encode_params
    return [t.to_binary(t.validate(params[n])) for (n, t) in zip(self.paramnames, self.vartypes)]
  File "/usr/local/lib/python2.7/dist-packages/cql/cqltypes.py", line 225, in to_binary
    return cls.serialize(val)
struct.error: cannot convert argument to integer

私はまた、以下を使用しようとしました:

cursor.execute_prepared(q, {'x':','.join([str(i) for i in (1,2,3)]), 'y':'abc'}

同じエラーが発生しました。WHERE ... IN (...,...) ステートメント内でクエリ置換を行う正しい方法を知っている人はいますか?

ありがとう!

4

1 に答える 1

3

Cassandraは、ここで準備されたクエリのバインドされた値を補間する部分であり、値のシーケンスのバインドをサポートしていないため、答えはほとんど「(まだ)それはできません」です。

そこでの状況を監視したい場合は、https://issues.apache.org/jira/browse/CASSANDRA-4210を参照してください。

プレーンコールのpython-cqlドライバーでこの種の構造をサポートすること可能ですがexecute()、クエリの補間はPython側で行われますが、準備されたクエリの利点は得られません。ただ以上のものである

cursor.execute('SELECT * FROM a WHERE b IN (%s)'
               % ', '.join(map(cql.query.cql_quote, your_list_of_values)))
于 2012-11-30T17:37:41.127 に答える