有没有人有使用pycassa的经验,我对此表示怀疑。如何获取存储在数据库中的所有密钥?
好吧,在这个小片段中,我们需要提供键以获取关联的列(这里的键是“foo”和“bar”),这很好,但我的要求是一次获取所有键(只有键)作为 Python 列表或类似的数据结构。
cf.multiget(['foo', 'bar'])
{'foo': {'column1': 'val2'}, 'bar': {'column1': 'val3', 'column2': 'val4'}}
谢谢。
有没有人有使用pycassa的经验,我对此表示怀疑。如何获取存储在数据库中的所有密钥?
好吧,在这个小片段中,我们需要提供键以获取关联的列(这里的键是“foo”和“bar”),这很好,但我的要求是一次获取所有键(只有键)作为 Python 列表或类似的数据结构。
cf.multiget(['foo', 'bar'])
{'foo': {'column1': 'val2'}, 'bar': {'column1': 'val3', 'column2': 'val4'}}
谢谢。
你可以试试: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]
get_range([start][, finish][, columns][, column_start][, column_finish][, column_reversed][, column_count][, row_count][, include_timestamp][, super_column][, read_consistency_level][, buffer_size])
获取指定键范围内行的迭代器。
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 返回一个生成器。我们可以从生成器创建一个字典并从中获取密钥。
column_count=0 将结果限制为 row_key。但是,由于这些结果没有列,我们还需要 filter_empty。
filter_empty=False 将允许我们得到结果。但是,现在我们的结果中可能会包含空行和范围重影。
如果我们不介意更多的开销,那么只获取第一列将解决空行和范围重影。
dict(cf.get_range(column_count=1)).keys()
Santhosh和kzarns 的答案存在问题,因为您正在将一个潜在的巨大字典带入内存,而您将立即丢弃该字典。更好的方法是为此使用列表推导:
keys = [c[0] for c in cf.get_range(column_count=0, filter_empty=False)]
这会遍历由 返回的生成器get_range
,将键保存在内存中并存储列表。
如果键列表也可能太大而无法一次将其全部保存在内存中,并且您只需要迭代一次,则应使用生成器表达式而不是列表推导:
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!