Bigtable Google Happybase Python KeyError при попытке сделать `counter_inc`

Я не уверен, почему, но counter_inc Метод не работает, нет эмулятора, указывающего на реальный экземпляр разработки.

Snippet:

from google.cloud import bigtable
from google.cloud import happybase

client = bigtable.Client(project='robbie-ai', admin=True)
instance = client.instance('visio-bt-staging')
connection = happybase.Connection(instance=instance)
connection.create_table('commons_TestBTModelsTable', {'family': None, 'counters': None})
table = connection.table('commons_TestBTModelsTable')
table.put('row-key1', {'family:surname': 'Trump'})
print("Getting row 'row-key1': {}".format(table.row(b'row-key1')))
table.counter_inc(b'row1', b'counters:qual1')

Если я сделаю table.counter_inc(b'row1', 'counters:qual1') точно так же.

Когда выполняется как скрипт:

root@2d21638ea17f:/app# python scripts/counters.py
Getting row 'row-key1': {b'family:surname': b'Trump'}
Traceback (most recent call last):
  File "scripts/counters.py", line 28, in <module>
    table.counter_inc(b'row1', b'counters:qual1')
  File "/usr/local/lib/python3.5/dist-packages/google/cloud/happybase/table.py", line 591, in counter_inc
    column_cells = modified_cells[column_family_id][column_qualifier]
KeyError: 'qual1'

Это ошибка или этот фрагмент имеет проблемы?

1 ответ

Решение

Определенно ошибка, они имеют разные типы для идентификатора столбца и возвращенного типа ключа dict, который он возвращает commit()в то время как тот, который вы получили из раскола, был декодирован в str,

здесь: https://github.com/GoogleCloudPlatform/google-cloud-python-happybase/blob/master/src/google/cloud/happybase/table.py

здесь https://github.com/GoogleCloudPlatform/google-cloud-python-happybase/blob/master/src/google/cloud/happybase/table.py

а здесь https://github.com/GoogleCloudPlatform/google-cloud-python-happybase/blob/master/src/google/cloud/happybase/table.py

если вы идете на более низкий уровень:

# As it is in the source code
row = table._low_level_table.row(b'row-key1', append=True)
column_family_id, column_qualifier = 'qual1'.split(':')
row.increment_cell_value(column_family_id, column_qualifier, 1)
row.commit()
"""outputs
{'counters': {b'qual1': [(b'\x00\x00\x00\x00\x00\x00\x00\x01',
datetime.datetime(2017, 6, 12, 14, 2, 28, 858000, tzinfo=<UTC>))]}}
"""
# of course if using the original portion code it breaks with KeyError as the returned key type is bytes
# Get the cells in the modified column,
column_cells = modified_cells[column_family_id][column_qualifier]
"""outputs
KeyError                                  Traceback (most recent call last)
<ipython-input-24-fe55fb8c47c5> in <module>()
      1 # Get the cells in the modified column,
----> 2 column_cells = modified_cells[column_family_id][column_qualifier]

KeyError: 'counters'
"""
# But it works if re-encoded the column 
# Get the cells in the modified column,
column_cells = modified_cells[column_family_id][column_qualifier.encode()]
column_cells
[(b'\x00\x00\x00\x00\x00\x00\x00\x04',
  datetime.datetime(2017, 6, 12, 14, 16, 18, 150000, tzinfo=<UTC>))]

Это для Python 3.5.2, в любом случае странно, что commit Ответ возвращает неоднородные типы ключей, что мне кажется неправильным.

Обходной путь, пока они не исправят это в pypi: переопределить counter_inc метод с вышеуказанной кодировкой

Другие вопросы по тегам