2010-03-12 26 views
6

Có ai có kinh nghiệm làm việc với pycassa Tôi nghi ngờ điều đó không. Làm cách nào để nhận tất cả các khóa được lưu trữ trong cơ sở dữ liệu?Làm cách nào để lấy tất cả các khóa được lưu trữ trong họ cột Cassandra bằng pycassa?

cũng trong đoạn mã nhỏ này, chúng tôi cần cung cấp các khóa để lấy các cột liên quan (ở đây các phím là 'foo' và 'bar'), điều đó là tốt nhưng yêu cầu của tôi là lấy tất cả các khóa các khóa) cùng một lúc dưới dạng danh sách Python hoặc cấu trúc dữ liệu tương tự.

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

Cảm ơn.

Trả lời

11

thử:

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

thứ tốt hơn ở đây: http://github.com/vomjom/pycassa

+0

tôi sẽ không cố gắng rằng đối với một cái bàn lớn... –

+1

dường như với api pycassa gần đây đã thay đổi một chút, nhưng điều này hoạt động: [x [0] cho x trong col_fam.get_range()] – okigan

5

Bạn có thể thử: 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] 
1

cải thiện nhỏ về giải pháp Santhosh của

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

Nếu bạn quan tâm đến thứ tự:

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

get_range trả về một máy phát điện. Chúng ta có thể tạo ra một dict từ máy phát và lấy chìa khóa từ đó.

column_count = 0 giới hạn kết quả cho row_key. Tuy nhiên, vì những kết quả này không có cột, chúng tôi cũng cần filter_empty.

filter_empty = False sẽ cho phép chúng tôi nhận kết quả. Tuy nhiên, các hàng trống và các dải ma số có thể được bao gồm trong kết quả của chúng tôi ngay bây giờ.

Nếu chúng tôi không bận tâm hơn, chỉ nhận cột đầu tiên sẽ giải quyết các hàng trống và các ô ảo.

dict(cf.get_range(column_count=1)).keys() 
0

Có một vấn đề với Santhosh'skzarns' câu trả lời, khi bạn đang mang trong ký ức một dict có tiềm năng rất lớn mà bạn sẽ ngay lập tức vứt bỏ. Một cách tiếp cận tốt hơn sẽ được sử dụng comprehensions danh sách cho việc này:

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

này lặp trên các máy phát điện được trả về bởi get_range, giữ chìa khóa trong bộ nhớ và lưu trữ danh sách.

Nếu danh sách các phím ở đâu cũng có khả năng quá lớn để giữ nó trong bộ nhớ cùng một lúc và bạn chỉ cần lặp lại một lần, bạn nên sử dụng một generator expression instead of a list comprehension:

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! 
Các vấn đề liên quan