关于EOS合约开发中Table查询的问题

作者: 北冥Master | 来源:发表于2018-08-10 14:56 被阅读5次

    EOS合约开发中,想要查询Table中的数据,有以下两种方式:

    1 通过合约方法查询

    my_index contents(_self, _self);
    auto iter = contents.find(id);
    print(iter->name);
    

    可自定义查询字段,精确控制返回结果。

    2 通过通用命令查询

    cleos get table contract acount table 
    

    contract:合约名称
    account:合约账户
    table:表名
    也可以根据id和key来查询,其他参数看命令Help。

    不带其他参数得到如下类似结果:

    {
      "rows": [{
          "id": 0,
          "author_account_name": 1,
          "owner_account_name": 2,
          "content_": "",
          "hash": "",
          "version": 3,
          "register_time": 4,
          "reprint_copyright_price": 5,
          "full_copyright_price": 6
        }
      ],
      "more": false
    }
    

    不过这种查询方式需要检查你的abi文件里面,tables这个字段是否有值,否则会报如下错误:

    Error 3060003: Contract Table Query Exception
    Most likely, the given table doesn't exist in the blockchain.
    

    意思就是找不到表名。

    abi文件关于tables定义部分类似如下:

    "tables": [{
           "name": "content",
           "index_type": "i64",
           "key_names": [
                 "id",
                 "author_account_name"
               ],
             "key_types": [
                 "uint32",
                 "uint64"
              ],
                 "type": "content"
         }]
    

    表名定义需要使用 @abi table table_name i64 注解,写在struct结构体定义的上面一行。
    如果没有,abi文件中的tables将是空值,也可在生成abi文件以后,手工添加。
    @abi table table_name i64注解类似如下:

    //@abi table content i64
    struct content{
        uint32_t id;
        uint64_t author_account_name;
        uint64_t owner_account_name;
        string content;
        string hash;
        uint64_t version;
        uint32_t primary_key() const{return id;}
        EOSLIB_SERIALIZE(content, (id)(author_account_name)(owner_account_name)(content)(hash)  (version))
    };
    

    这样你就能愉快的使用cleos get table命令来查询任何table的数据了,当然你需要有相应table的权限。

    相关文章

      网友评论

        本文标题:关于EOS合约开发中Table查询的问题

        本文链接:https://www.haomeiwen.com/subject/rtgkbftx.html