You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在DolphinDB插件函数中写入表时如何获取实际插入的行数?

在DolphinDB插件函数中写入表时如何获取实际插入的行数?

嗨,这个问题我在做DolphinDB插件开发的时候刚好碰到过,给你捋捋靠谱的解决办法!

首先得说清楚:DolphinDB内置的append!函数返回的是修改后的目标表对象,不是插入行数,所以咱们得换个思路——对比插入前后目标表的行数差,这才是最准确的(毕竟有时候会因为主键冲突、数据校验不通过等情况,实际插入的行数和你准备的批量表行数不一样)。

下面给你补全代码并解释每一步:

#include <DolphinDB.h>
using namespace dolphindb;

// 假设这是你的插件函数逻辑里的代码片段
int getInsertedRows(Heap* heap, ConstantSP destTable, ConstantSP batchTable) {
    int insertedRows = 0;
    try {
        // 1. 先获取内置的rows函数,用来查询表的行数(内存/分布式表通用)
        FunctionDefSP rowsFunc = heap->currentSession()->getFunctionDef("rows");
        vector<ConstantSP> rowArgs = {destTable};

        // 2. 记录插入前目标表的行数
        ConstantSP rowCountBefore = rowsFunc->execute(rowArgs);
        int64_t before = rowCountBefore->getInt64();

        // 3. 执行append!插入操作
        FunctionDefSP appendFunc = heap->currentSession()->getFunctionDef("append!");
        vector<ConstantSP> appendArgs = {destTable, batchTable};
        appendFunc->execute(appendArgs); // 这里执行插入,返回的是修改后的表,我们暂时用不上

        // 4. 记录插入后目标表的行数
        ConstantSP rowCountAfter = rowsFunc->execute(rowArgs);
        int64_t after = rowCountAfter->getInt64();

        // 5. 计算实际插入的行数
        insertedRows = static_cast<int>(after - before);
    } catch (const Exception& e) {
        // 处理插入失败的情况,比如打日志、返回错误标记
        insertedRows = -1; // 用-1表示插入失败,你也可以自定义其他逻辑
    }
    return insertedRows;
}

几个关键注意事项:

  • 别偷懒用batchTable的行数当插入数:真的会踩坑!比如目标表有主键约束时,重复数据会被自动过滤,这时候实际插入数就比批量表的行数少,只有对比目标表的前后行数才是100%准确的。
  • 分布式表同样适用:DolphinDB的rows函数对分布式表会自动汇总所有节点的行数,不用你手动去各个节点统计,非常省心。
  • 一定要加异常处理:如果append!执行失败(比如表结构不匹配、权限问题),会抛出异常,这时候捕获异常能避免程序崩溃,还能给调用方返回明确的错误标记。

这个方法我在生产环境的插件里用过好多次,不管是内存表还是分布式表都稳定得很,绝对能拿到真实的插入行数~

火山引擎 最新活动