使用 C++ 将缺少列的行发送到 QuestDB

问题描述 投票:0回答:1

我正在使用 C++ 客户端提取一些数据,但我遇到了如何实现缺失列的一些问题。

在 python 中,我可以有一个列字典,如下所示:

{“price1”: 10.0, “price2”:10.1}

如果price2不可用,我可以这样做:

{“price1”:10.0, “price2”:None}

我理解它相当于:

{“price1”:10.0}

我可以将我的字典作为列参数传递给

sender.rows
,它会透明地将行(无论是否缺少列)发送到服务器。

我在 C++ 中复制此操作时遇到了一些麻烦,我一直在研究如何做到这一点,但没有成功,因为 C++ 客户端显然不允许传递空列。

您建议我如何针对 cpp 中的“参差不齐”行实现此功能?

database time-series questdb
1个回答
0
投票

根据 QuestDB 示例,在 C++ 中,您使用缓冲区,如下所示:

 buffer
    .table("trades")
    .symbol("symbol","ETH-USD")
    .symbol("side","sell")
    .column("price", 2615.54)
    .column("amount", 0.00044)
    .at(questdb::ingress::timestamp_nanos::now());

    // To insert more records, call `buffer.table(..)...` again.

    sender.flush(buffer);

您需要在缓冲区末尾调用

at
,以便数据排队等待发送,但您可以根据每行需要多次调用
symbol
column
,并且可以有条件地执行此操作。

下面的示例构建一个包含三行的向量,其中一行具有空列,然后迭代该向量并检查可选的

price
列是否为空。如果是,它会跳过对该列上的缓冲区调用
column

#include <questdb/ingress/line_sender.hpp>
#include <iostream>
#include <chrono>
#include <vector>
#include <optional>
#include <string>

int main()
{
    try
    {
        auto sender = questdb::ingress::line_sender::from_conf(
            "http::addr=localhost:9000;username=admin;password=quest;retry_timeout=20000;");

        auto now = std::chrono::system_clock::now();
        auto duration = now.time_since_epoch();
        auto nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(duration).count();

        struct Row {
            std::string symbol;
            std::string side;
            std::optional<double> price;
            double amount;
        };

        std::vector<Row> rows = {
            {"ETH-USD", "sell", 2615.54, 0.00044},
            {"BTC-USD", "sell", 39269.98, 0.001},
            {"SOL-USD", "sell", std::nullopt, 5.5} // Missing price
        };

        questdb::ingress::line_sender_buffer buffer;

        for (const auto& row : rows) {
            buffer.table("trades")
                .symbol("symbol", row.symbol)
                .symbol("side", row.side);

            if (row.price.has_value()) {
                buffer.column("price", row.price.value());
            }

            buffer.column("amount", row.amount)
                .at(questdb::ingress::timestamp_nanos(nanos));
        }

        sender.flush(buffer);
        sender.close();

        std::cout << "Data successfully sent!" << std::endl;
        return 0;
    }
    catch (const questdb::ingress::line_sender_error& err)
    {
        std::cerr << "Error running example: " << err.what() << std::endl;
        return 1;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.