influxdb数据写入操作(python、C++实现)

2024-08-24 19:48

本文主要是介绍influxdb数据写入操作(python、C++实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基础概念

Point

Point由时间戳(time)、数据(field)、标签(tags)组成。

Point相当于传统数据库里的一行数据
Point属性 传统数据库中的概念
time 每个数据记录时间,是数据库中的主索引(会自动生成)
fields 各种记录值(没有索引的属性)也就是记录的值:温度, 湿度
tags 各种有索引的属性:地区,海拔

python实现

普通写入操作

'<username>':用户名
'<pwd>':密码
'<dbname>':数据库名
"<table_name>": 数据表名

from influxdb import InfluxDBClientclient = InfluxDBClient(host='127.0.0.1', port=8086, username='<username>', password='<pwd>', database='<dbname>')
points=[]
base_data = {'data1': 1, 'data2': 1}
points.append({"measurement": "<table_name>", "fields": base_data})
client.write_points(points)

定时写入

import math
from influxdb import InfluxDBClient
from datetime import datetime
import timeclient = InfluxDBClient(host='10.13.0.134', port=8086, username='root', password='root', database='cip')def write_influxdb(sleep_time=100, table_name="test"):sleep_time = sleep_time * 1.0 / 1000print(f"睡眠{sleep_time}秒")index = 0base_data = {'Unnamed: 2': -51.581135, 'Unnamed: 3': -133.20916699999998}while True:points = []time.sleep(sleep_time)index += 1base_data["index"] = indexpoints.append({"measurement": table_name, "fields": base_data, "time": datetime.utcnow().isoformat()})client.write_points(points)if __name__ == '__main__':write_influxdb(sleep_time=40)

c++实现

1 使用库

git clone https://github.com/awegrzyn/influxdb-cxx

使用:

#include <InfluxDBFactory.h>std::unique_ptr<InfluxDB> InfluxDBFactory::Get(std::string url)

参考:https://blog.csdn.net/lclfans1983/article/details/109156307

2 自己写

<influxdb.hpp>

#ifndef INFLUXDB_CPP_HPP
#define INFLUXDB_CPP_HPP#include <sstream>
#include <cstring>
#include <cstdio>#ifdef _WIN32#define NOMINMAX#include <windows.h>#include <algorithm>#pragma comment(lib, "ws2_32")typedef struct iovec { void* iov_base; size_t iov_len; } iovec;inline __int64 writev(int sock, struct iovec* iov, int cnt) {__int64 r = send(sock, (const char*)iov->iov_base, iov->iov_len, 0);return (r < 0 || cnt == 1) ? r : r + writev(sock, iov + 1, cnt - 1);}
#else#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/uio.h>#include <netinet/in.h>#include <arpa/inet.h>#define closesocket close
#endifnamespace influxdb_cpp {struct server_info {std::string host_;int port_;std::string db_;std::string usr_;std::string pwd_;std::string precision_;server_info(const std::string& host, int port, const std::string& db = "", const std::string& usr = "", const std::string& pwd = "", const std::string& precision="ms"): host_(host), port_(port), db_(db), usr_(usr), pwd_(pwd), precision_(precision) {}};namespace detail {struct meas_caller;struct tag_caller;struct field_caller;struct ts_caller;struct inner {static int http_request(const char*, const char*, const std::string&, const std::string&, const server_info&, std::string*);static inline unsigned char to_hex(unsigned char x) { return  x > 9 ? x + 55 : x + 48; }static void url_encode(std::string& out, const std::string& src);};}inline int query(std::string& resp, const std::string& query, const server_info& si) {std::string qs("&q=");detail::inner::url_encode(qs, query);return detail::inner::http_request("GET", "query", qs, "", si, &resp);}inline int create_db(std::string& resp, const std::string& db_name, const server_info& si) {std::string qs("&q=create+database+");detail::inner::url_encode(qs, db_name);return detail::inner::http_request("POST", "query", qs, "", si, &resp);}struct builder {detail::tag_caller& meas(const std::string& m) {lines_.imbue(std::locale("C"));lines_.clear();return _m(m);}protected:detail::tag_caller& _m(const std::string& m) {_escape(m, ", ");return (detail::tag_caller&)*this;}detail::tag_caller& _t(const std::string& k, const std::string& v) {lines_ << ',';_escape(k, ",= ");lines_ << '=';_escape(v, ",= ");return (detail::tag_caller&)*this;}detail::field_caller& _f_s(char delim, const std::string& k, const std::string& v) {lines_ << delim;_escape(k, ",= ");lines_ << "=\"";_escape(v, "\"");lines_ << '\"';return (detail::field_caller&)*this;}detail::field_caller& _f_i(char delim, const std::string& k, long long v) {lines_ << delim;_escape(k, ",= ");lines_ << '=';lines_ << v << 'i';return (detail::field_caller&)*this;}detail::field_caller& _f_f(char delim, const std::string& k, double v, int prec) {lines_ << delim;_escape(k, ",= ");lines_.precision(prec);lines_.setf(std::ios::fixed);lines_ << '=' << v;return (detail::field_caller&)*this;}detail::field_caller& _f_b(char delim, const std::string& k, bool v) {lines_ << delim;_escape(k, ",= ");lines_ << '=' << (v ? 't' : 'f');return (detail::field_caller&)*this;}detail::ts_caller& _ts(long long ts) {lines_ << ' ' << ts;return (detail::ts_caller&)*this;}int _post_http(const server_info& si, std::string* resp) {return detail::inner::http_request("POST", "write", "", lines_.str(), si, resp);}int _send_udp(const std::string& host, int port) {int sock, ret = 0;struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(port);if((addr.sin_addr.s_addr = inet_addr(host.c_str())) == INADDR_NONE) return -1;if((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) return -2;lines_ << '\n';if(sendto(sock, &lines_.str()[0], lines_.str().length(), 0, (struct sockaddr *)&addr, sizeof(addr)) < (int)lines_.str().length())ret = -3;closesocket(sock);return ret;}void _escape(const std::string& src, const char* escape_seq) {size_t pos = 0, start = 0;while((pos = src.find_first_of(escape_seq, start)) != std::string::npos) {lines_.write(src.c_str() + start, pos - start);lines_ << '\\' << src[pos];start = ++pos;}lines_.write(src.c_str() + start, src.length() - start);}std::stringstream lines_;};namespace detail {struct tag_caller : public builder {detail::tag_caller& tag(const std::string& k, const std::string& v)       { return _t(k, v); }detail::field_caller& field(const std::string& k, const std::string& v)   { return _f_s(' ', k, v); }detail::field_caller& field(const std::string& k, bool v)                 { return _f_b(' ', k, v); }detail::field_caller& field(const std::string& k, short v)                { return _f_i(' ', k, v); }detail::field_caller& field(const std::string& k, int v)                  { return _f_i(' ', k, v); }detail::field_caller& field(const std::string& k, long v)                 { return _f_i(' ', k, v); }detail::field_caller& field(const std::string& k, long long v)            { return _f_i(' ', k, v); }detail::field_caller& field(const std::string& k, double v, int prec = 2) { return _f_f(' ', k, v, prec); }private:detail::tag_caller& meas(const std::string& m);};struct ts_caller : public builder {detail::tag_caller& meas(const std::string& m)                            { lines_ << '\n'; return _m(m); }int post_http(const server_info& si, std::string* resp = NULL)            { return _post_http(si, resp); }int send_udp(const std::string& host, int port)                           { return _send_udp(host, port); }};struct field_caller : public ts_caller {detail::field_caller& field(const std::string& k, const std::string& v)   { return _f_s(',', k, v); }detail::field_caller& field(const std::string& k, bool v)                 { return _f_b(',', k, v); }detail::field_caller& field(const std::string& k, short v)                { return _f_i(',', k, v); }detail::field_caller& field(const std::string& k, int v)                  { return _f_i(',', k, v); }detail::field_caller& field(const std::string& k, long v)                 { return _f_i(',', k, v); }detail::field_caller& field(const std::string& k, long long v)            { return _f_i(',', k, v); }detail::field_caller& field(const std::string& k, double v, int prec = 2) { return _f_f(',', k, v, prec); }detail::ts_caller& timestamp(unsigned long long ts)                       { return _ts(ts); }};inline void inner::url_encode(std::string& out, const std::string& src) {size_t pos = 0, start = 0;while((pos = src.find_first_not_of("abcdefghijklmnopqrstuvwxyqABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~", start)) != std::string::npos) {out.append(src.c_str() + start, pos - start);if(src[pos] == ' ')out += "+";else {out += '%';out += to_hex((unsigned char)src[pos] >> 4);out += to_hex((unsigned char)src[pos] & 0xF);}start = ++pos;}out.append(src.c_str() + start, src.length() - start);}inline int inner::http_request(const char* method, const char* uri,const std::string& querystring, const std::string& body, const server_info& si, std::string* resp) {std::string header;struct iovec iv[2];struct sockaddr_in addr;int sock, ret_code = 0, content_length = 0, len = 0;char ch;unsigned char chunked = 0;addr.sin_family = AF_INET;addr.sin_port = htons(si.port_);if((addr.sin_addr.s_addr = inet_addr(si.host_.c_str())) == INADDR_NONE) return -1;if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) return -2;if(connect(sock, (struct sockaddr*)(&addr), sizeof(addr)) < 0) {closesocket(sock);return -3;}header.resize(len = 0x100);for(;;) {iv[0].iov_len = snprintf(&header[0], len,"%s /%s?db=%s&u=%s&p=%s&epoch=%s%s HTTP/1.1\r\nHost: %s\r\nContent-Length: %d\r\n\r\n",method, uri, si.db_.c_str(), si.usr_.c_str(), si.pwd_.c_str(), si.precision_.c_str(),querystring.c_str(), si.host_.c_str(), (int)body.length());if((int)iv[0].iov_len >= len)header.resize(len *= 2);elsebreak;}iv[0].iov_base = &header[0];iv[1].iov_base = (void*)&body[0];iv[1].iov_len = body.length();if(writev(sock, iv, 2) < (int)(iv[0].iov_len + iv[1].iov_len)) {ret_code = -6;goto END;}iv[0].iov_len = len;#define _NO_MORE() (len >= (int)iv[0].iov_len && \(iv[0].iov_len = recv(sock, &header[0], header.length(), len = 0)) == size_t(-1))
#define _GET_NEXT_CHAR() (ch = _NO_MORE() ? 0 : header[len++])
#define _LOOP_NEXT(statement) for(;;) { if(!(_GET_NEXT_CHAR())) { ret_code = -7; goto END; } statement }
#define _UNTIL(c) _LOOP_NEXT( if(ch == c) break; )
#define _GET_NUMBER(n) _LOOP_NEXT( if(ch >= '0' && ch <= '9') n = n * 10 + (ch - '0'); else break; )
#define _GET_CHUNKED_LEN(n, c) _LOOP_NEXT( if(ch >= '0' && ch <= '9') n = n * 16 + (ch - '0'); \else if(ch >= 'A' && ch <= 'F') n = n * 16 + (ch - 'A') + 10; \else if(ch >= 'a' && ch <= 'f') n = n * 16 + (ch - 'a') + 10; else {if(ch != c) { ret_code = -8; goto END; } break;} )
#define _(c) if((_GET_NEXT_CHAR()) != c) break;
#define __(c) if((_GET_NEXT_CHAR()) != c) { ret_code = -9; goto END; }if(resp) resp->clear();_UNTIL(' ')_GET_NUMBER(ret_code)for(;;) {_UNTIL('\n')switch(_GET_NEXT_CHAR()) {case 'C':_('o')_('n')_('t')_('e')_('n')_('t')_('-')_('L')_('e')_('n')_('g')_('t')_('h')_(':')_(' ')_GET_NUMBER(content_length)break;case 'T':_('r')_('a')_('n')_('s')_('f')_('e')_('r')_('-')_('E')_('n')_('c')_('o')_('d')_('i')_('n')_('g')_(':')_(' ')_('c')_('h')_('u')_('n')_('k')_('e')_('d')chunked = 1;break;case '\r':__('\n')switch(chunked) {do {__('\r')__('\n')case 1:_GET_CHUNKED_LEN(content_length, '\r')__('\n')if(!content_length) {__('\r')__('\n')goto END;}case 0:while(content_length > 0 && !_NO_MORE()) {content_length -= (iv[1].iov_len = std::min(content_length, (int)iv[0].iov_len - len));if(resp) resp->append(&header[len], iv[1].iov_len);len += iv[1].iov_len;}} while(chunked);}goto END;}if(!ch) {ret_code = -10;goto END;}}ret_code = -11;END:closesocket(sock);return ret_code / 100 == 2 ? 0 : ret_code;
#undef _NO_MORE
#undef _GET_NEXT_CHAR
#undef _LOOP_NEXT
#undef _UNTIL
#undef _GET_NUMBER
#undef _GET_CHUNKED_LEN
#undef _
#undef __}}
}#endif // INFLUXDB_CPP_HPP

使用案例:

#include "influxdb.hpp"
#include <iostream>
using namespace std;int savetcp(int argc, char const *argv[])
{influxdb_cpp::server_info si("127.0.0.1", 8086, "testx", "test", "test");// post_http demo with resp[optional]string resp;int ret = influxdb_cpp::builder().meas("test").tag("k", "v").tag("x", "y").field("x", 10).field("y", 10.3, 2).field("b", !!10).timestamp(1512722735522840439).post_http(si, &resp);cout << ret << endl << resp << endl;}

这篇关于influxdb数据写入操作(python、C++实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103433

相关文章

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑