代码之家  ›  专栏  ›  技术社区  ›  bartaelterman

如果子消息没有字段,如何在protobuf消息上分配oneof字段?

  •  1
  • bartaelterman  · 技术社区  · 6 年前

    我想创建一个大表 DeleteFromRow 突变。原版 Mutation 以及 删除FromRow 如下所示:

    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中,不能直接实例化 删除FromRow 对象并设置 delete_from_row 的字段 突变 对那个物体。

    所以这个 不起作用 :

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

    由其他SO用户提出(请参见 this question ,结果是

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

    根据 protobuf docs ,您应该通过设置其中一个子字段来设置一个one of字段。所以A DeleteFromFamily 突变的产生方式如下:

    mutation.delete_from_family.family_name = 'some_family'
    

    但是,我该怎么做呢 删除FromRow 没有字段的消息?

    1 回复  |  直到 6 年前
        1
  •  1
  •   bartaelterman    6 年前

    DeleteFromRow delete_from_row

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

    add append here extend

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