我正在使用 C++ 客户端提取一些数据,但我遇到了如何实现缺失列的一些问题。
在 python 中,我可以有一个列字典,如下所示:
{“price1”: 10.0, “price2”:10.1}
如果price2不可用,我可以这样做:
{“price1”:10.0, “price2”:None}
我理解它相当于:
{“price1”:10.0}
我可以将我的字典作为列参数传递给
sender.rows
,它会透明地将行(无论是否缺少列)发送到服务器。
我在 C++ 中复制此操作时遇到了一些麻烦,我一直在研究如何做到这一点,但没有成功,因为 C++ 客户端显然不允许传递空列。
您建议我如何针对 cpp 中的“参差不齐”行实现此功能?
根据 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;
}
}