Python开发后端InfluxDB数据库测试接口

1、使用PyCharm创建一个Python项目wzClear

2、新建package包wzInfluxdb和wzConfig包,如上图所示,新建一个DB.json配置文件并添加influxdb配置信息,DB.json为统一配置文件

复制代码
  {
    "influxdbV1": {
      "url": "http://192.168.0.44:8086",
      "username": "root",
      "password": "root",
      "database": "wzClean",
      "measurement": "HourData"
    }
}

3、搭建influxdb_util.py配置文件

复制代码
import json
import os
import pandas as pd
from influxdb import InfluxDBClient


class InfluxDBUtil:
    def __init__(self, config_path='./wzConfig/DB.json'):
        
        self.client = None
        self.measurement = None
        self._load_config(config_path)
        self._connect()

    def _load_config(self, path):
        with open(path, 'r', encoding='utf-8') as f:
            config = json.load(f)
        influx = config['influxdbV1']
        self.host, self.port = influx['url'].replace("http://", "").split(":")
        self.username = influx['username']
        self.password = influx['password']
        self.database = influx['database']
        self.measurement = influx['measurement']

    def _connect(self):
        try:
            self.client = InfluxDBClient(
                host=self.host.strip(),
                port=int(self.port.strip()),
                username=self.username,
                password=self.password,
                database=self.database
            )
            self.log.info("InfluxDB connected.")
        except Exception as e:
            self.log.error(f"InfluxDB connection error: {e}")

    def insert(self, data: list):
        try:
            df = pd.DataFrame(data)
            if df.empty:
                self.log.warning("No data to insert.")
                return

            df["time"] = pd.to_datetime(df["colTime"], format="%Y-%m-%d %H:%M:%S").dt.strftime("%Y-%m-%dT%H:%M:%SZ")
            df["colValue"] = df["colValue"].astype(str)
            df["isBreak"] = df["isBreak"].astype(str)
            df["proID"] = df["proID"].astype(str)
            df["varID"] = df["varID"].astype(str)

            json_body = df.apply(lambda row: {
                "measurement": self.measurement,
                "tags": {
                    "proID": row["proID"],
                    "varID": row["varID"]
                },
                "time": row["time"],
                "fields": {
                    "colValue": row["colValue"],
                    "isBreak": row["isBreak"]
                }
            }, axis=1).tolist()

            if self.client.write_points(json_body):
                self.log.info(f"{len(json_body)} points inserted into InfluxDB.")
            else:
                self.log.error("Failed to insert data.")
        except Exception as e:
            self.log.error(f"Insert error: {e}")

    def drop_measurement(self, measurement_name):
        """
        删除表
        :param measurement_name:
        :return:
        """
        try:
            self.client.query(f'DROP MEASUREMENT "{measurement_name}"')
            
        except Exception as e:
            print(f"Drop measurement error: {e}")

    def query(self, influxql: str):
        """
        使用查询数据库信息
        :param influxql:
        :return:
        """
        try:
            result = self.client.query(influxql)
            points = list(result.get_points())
            
            
            return points
        except Exception as e:
           
            return []
    def close(self):
        if self.client:
            self.client.close()

4、接口测试,新建一个app.py,使用flask进行测试

复制代码
from flask import Flask, request, jsonify, send_from_directory
from wzInfluxdb.influxdb_util import InfluxDBUtil

app = Flask(__name__,
            static_folder=ROOT_DIR + '/static',
            static_url_path='/static',
            template_folder=ROOT_DIR + '/templates')
@app.route('/searchObject', methods=['POST', 'GET'])
def searchObject():
    now = datetime.now()
    # 计算前一天 00:00:00 和 当天 00:00:00,转为 UTC
    start_dt = (now - timedelta(days=days)).replace(hour=0, minute=0, second=0, microsecond=0)
    end_dt = now.replace(hour=0, minute=0, second=0, microsecond=0)
    # 转为 UTC ISO 格式
    start_time_utc = start_dt.astimezone(pytz.UTC).strftime('%Y-%m-%dT%H:%M:%SZ')
    end_time_utc = end_dt.astimezone(pytz.UTC).strftime('%Y-%m-%dT%H:%M:%SZ')
    # 构建 SQL 查询  单个对象ID的查询和绘制图像
    sql = f"SELECT amount,strTime FROM HourData WHERE equID = '111' AND varID = '30' AND time >= '{start_time_utc}' AND time < '{end_time_utc}' "
    influxdb = InfluxDBUtil()
    # data2 = influxdb.query_measurement(condition="equID='202012021658119701893f93cec9970'", limit=5)
    data2 = influxdb.query(sql)
    
    return jsonify({"result": data2 })
    except Exception as e:
        
        return jsonify({"error": str(e)}), 500
相关推荐
Web极客码4 分钟前
虚拟主机与独立服务器:哪个更好?
运维·服务器·虚拟主机
码农黛兮_4614 分钟前
SQL 索引优化指南:原理、知识点与实践案例
数据库·sql
爆肝疯学大模型15 分钟前
SQL server数据库实现远程跨服务器定时同步传输数据
运维·服务器·数据库
源码方舟21 分钟前
【基于ALS模型的教育视频推荐系统(Java实现)】
java·python·算法·音视频
萑澈32 分钟前
2025深圳杯D题法医物证多人身份鉴定问题四万字思路
python·数学建模
Ronin-Lotus35 分钟前
图像处理篇---MJPEG视频流处理
图像处理·python·opencv
溪饱鱼1 小时前
第6章: SEO与交互指标
服务器·前端·microsoft
请你喝好果汁6411 小时前
python_竞态条件
开发语言·python
正在走向自律1 小时前
Python 数据分析与可视化:开启数据洞察之旅(5/10)
开发语言·人工智能·python·数据挖掘·数据分析
我来整一篇1 小时前
用Redis的List实现消息队列
数据库·redis·list