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
相关推荐
GIS之路41 分钟前
GeoTools 基础概念解析
数据库·设计模式·oracle
SaleCoder43 分钟前
用Python构建机器学习模型预测股票趋势:从数据到部署的实战指南
开发语言·python·机器学习·python股票预测·lstm股票模型·机器学习股票趋势
NetX行者4 小时前
.NET 9 GUID v7 vs v4:时间有序性如何颠覆数据库索引性能
数据库·mysql·abp vnext
sunon_4 小时前
实现druid数据源密码加密
数据库
sevevty-seven5 小时前
Redis中的红锁
数据库·redis·php
技术猿188702783517 小时前
实现“micro 关键字搜索全覆盖商品”并通过 API 接口提供实时数据(一个方法)
开发语言·网络·python·深度学习·测试工具
烛阴7 小时前
为什么你的Python项目总是混乱?层级包构建全解析
前端·python
三金C_C7 小时前
asyncio 与 uvloop
python·异步·asyncio
放飞自我的Coder7 小时前
【colab 使用uv创建一个新的python版本运行】
开发语言·python·uv
不易思不逸7 小时前
Ubuntu20.04 RTX 4080 Nvidia驱动安装
运维·服务器