Как назначить поле oneof в сообщении protobuf, если дочернее сообщение не имеет полей? - PullRequest
0 голосов
/ 11 июня 2018

Я хочу создать мутацию BigTable DeleteFromRow.Прото для Mutation и DeleteFromRow выглядит следующим образом:

oneof mutation {
    // Set a cell's value.
    SetCell set_cell = 1;

    // Deletes cells from a column.
    DeleteFromColumn delete_from_column = 2;

    // Deletes cells from a column family.
    DeleteFromFamily delete_from_family = 3;

    // Deletes cells from the entire row.
    DeleteFromRow delete_from_row = 4;
  }
}

message DeleteFromRow {

}

В Python вы не можете напрямую создать экземпляр объекта DeleteFromRow и установить для поля delete_from_row поля Mutation значениеэтот объект.

Так что не работает :

request = bigtable_pb2.MutateRowRequest(table_name='tablename', row_key=row_key)
mutation = request.mutations.add()
mutation.delete_from_row = data_pb2.Mutation.DeleteFromRow()

Как было задано другими пользователями SO (см. этот вопрос ), что приводитв

AttributeError: Assignment not allowed to composite field "delete_from_row" in protocol message object.

В соответствии с protobuf docs , вы должны установить одно из полей, установив одно из дочерних полей.Таким образом, мутация DeleteFromFamily должна создаваться следующим образом:

mutation.delete_from_family.family_name = 'some_family'

Однако как мне это сделать для сообщения DeleteFromRow, в котором нет полей?

1 Ответ

0 голосов
/ 11 июня 2018

Вы можете инициировать объект DeleteFromRow и создать мутацию с ключевым словом аргумент delete_from_row:

dfr = data_pb2.Mutation.DeleteFromRow()
mutation = data_pb2.Mutation(delete_from_row=dfr)

Пока вы не можете add или append эту мутацию в поле повторяющихся мутацийзапрос (хотя мне кажется, что это то, что документы говорят здесь ), вы можете extend это:

request = bigtable_pb2.MutateRowRequest(table_name='tablename', row_key=row_key)
request.mutations.extend([mutation])
...