6

pycassaを使用した経験がある人はいますか? データベースに保存されているすべてのキーを取得するにはどうすればよいですか?

この小さなスニペットでは、関連付けられた列を取得するためにキーを指定する必要があります (ここでは、キーは「foo」と「bar」です)。これで問題ありませんが、私の要件は、すべてのキー (キーのみ) を一度に取得することです。 Python リストまたは同様のデータ構造として。

cf.multiget(['foo', 'bar'])
{'foo': {'column1': 'val2'}, 'bar': {'column1': 'val3', 'column2': 'val4'}}

ありがとう。

4

5 に答える 5

11

試す:

    list(cf.get_range().get_keys())

ここでもっと良いもの:http://github.com/vomjom/pycassa

于 2010-03-29T20:08:44.717 に答える
5

試すことができます: cf.get_range(column_count=0,filter_empty=False).

# Since get_range() returns a generator - print only the keys.
for value in cf.get_range(column_count=0,filter_empty=False):
    print value[0]
于 2012-10-15T13:10:37.863 に答える
1

Santhosh のソリューションのマイナーな改善

dict(cf.get_range(column_count=0,filter_empty=False)).keys()

注文が気になる場合:

OrderedDict(cf.get_range(column_count=0,filter_empty=False)).keys()

get_range はジェネレータを返します。ジェネレーターから dict を作成し、そこからキーを取得できます。

column_count=0 は、結果を row_key に制限します。ただし、これらの結果には列がないため、filter_empty も必要です。

filter_empty=False で結果を取得できます。ただし、空の行と範囲のゴーストが結果に含まれる可能性があります。

追加のオーバーヘッドが気にならない場合は、最初の列だけを取得すると、空の行と範囲のゴーストが解決されます。

dict(cf.get_range(column_count=1)).keys()
于 2013-07-25T14:52:10.547 に答える
1

get_range([start][, finish][, columns][, column_start][, column_finish][, column_reversed][, column_count][, row_count][, include_timestamp][, super_column][, read_consistency_level][, buffer_size])

指定されたキー範囲の行に対する反復子を取得します。

http://pycassa.github.com/pycassa/api/pycassa/columnfamily.html#pycassa.columnfamily.ColumnFamily.get_range

于 2011-03-17T21:15:19.763 に答える
0

Santhoshkzarns の回答には問題があります。すぐに破棄する可能性のある巨大な辞書をメモリに取り込んでいるからです。より良いアプローチは、これにリスト内包表記を使用することです。

keys = [c[0] for c in cf.get_range(column_count=0, filter_empty=False)]

これは、によって返されたジェネレーターを反復処理しget_range、キーをメモリに保持し、リストを保存します。

キーのリストが大きすぎて一度にメモリに保持できない可能性があり、1 回だけ反復する必要がある場合は、リスト内包表記の代わりにジェネレーター式を使用する必要があります。

kgen = (c[0] for c in cf.get_range(column_count=0, filter_empty=False))
# you can iterate over kgen, but do not treat it as a list, it isn't!
于 2015-02-12T20:30:24.310 に答える