go - 如何查询具有部分键值的表

标签 go blockchain hyperledger hyperledger-fabric

我正在使用 hyperledger (v0.6) 表并具有如下结构;

var columnDefsTableOne []*shim.ColumnDefinition
columnOneTableOneDef := shim.ColumnDefinition{Name: "RefNum",
    Type: shim.ColumnDefinition_STRING, Key: true}
columnTwoTableOneDef := shim.ColumnDefinition{Name: "Amount",
    Type: shim.ColumnDefinition_STRING, Key: false}
columnThreeTableOneDef := shim.ColumnDefinition{Name: "Status",
    Type: shim.ColumnDefinition_STRING, Key: true}
columnDefsTableOne = append(columnDefsTableOne, &columnOneTableOneDef)
columnDefsTableOne = append(columnDefsTableOne, &columnTwoTableOneDef)
columnDefsTableOne = append(columnDefsTableOne, &columnThreeTableOneDef)
    return stub.CreateTable("Recon", columnDefsTableOne)

当我仅使用 RefNum 或同时使用 RefNumStatus 查询表时,将返回该行。但是,如果我尝试仅根据 Status 进行查询,则不会返回任何内容。有什么办法可以实现吗?

下面是查询代码

if len(args) < 1 {
    return nil, errors.New("Function failed. Must include at least key values")
}

var columns []shim.Column

col1Val := args[0]
col1 := shim.Column{Value: &shim.Column_String_{String_: col1Val}}
columns = append(columns, col1)

if len(args) > 1 {
    col2Val := args[1]
    col2 := shim.Column{Value: &shim.Column_String_{String_: col2Val}}
    columns = append(columns, col2)
}

rowChannel, err := stub.GetRows("Recon", columns)
if err != nil {
    return nil, fmt.Errorf("Operation failed. %s", err)
}

var rows []shim.Row
for {
    select {
    case row, ok := <-rowChannel:
        if !ok {
            rowChannel = nil
        } else {
            rows = append(rows, row)
        }
    }
    if rowChannel == nil {
        break
    }
}

jsonRows, err := json.Marshal(rows)
if err != nil {
    return nil, fmt.Errorf("Operation failed. Error marshaling JSON: %s", err)
}

return jsonRows, nil

最佳答案

行键不是关系数据库意义上的真正键。在内部,范围查询用于针对串联的键集。因此,查询中的键必须按照与建模时相同的顺序提供。

链代码 API 已在 Fabric v1.0 中更新,使行为更加直观。在 v1.0 中,您可以为复合键建模,然后查询键的子集(同样,按照它们被建模的顺序)。

要查询不同的键组合,您必须为要查询的每个唯一组合建模。将这些视为简单的索引。

在 v1.0 中,您还可以将数据建模为 JSON,并使用 CouchDB 作为状态数据库。在这种情况下,您可以直接查询 JSON 的任何字段。

此处的 marbles02 链代码中有两个数据模式的示例:

https://github.com/hyperledger/fabric/blob/release/examples/chaincode/go/marbles02/marbles_chaincode.go.

关于go - 如何查询具有部分键值的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42689667/

相关文章:

azure - 如何使用 Go SDK 在 Azure AD 中创建新组?

linux - 无法在 Linux 上的 goroutine 中运行 go web serve (Mint)

ios - 在 Xcode 中发送交易时收到 "configurationError"

javascript - 使用 Bitcore 进行简单的一对一比特币交易

json - 如何通过 json 将键值对数组传递给结构的 golang slice

ruby - 如何使用 Go 共享库在 Ruby 中传递字符串数组并获取字符串数组?

go - 运行抓取单元测试的“无效的内存地址或nil指针取消引用”?

blockchain - 锯齿波事务处理器消息

block - 如何从部署在使用 hyperledger-fabric 中的单个 channel 连接的两个不同组织对等体上的另一个链代码调用链代码?

gradle - Hyperledger:使用Gradle构建Chaincode