1
donnees_meteo/meteo/schema.py
2025-11-17 02:00:28 +01:00

144 lines
3.3 KiB
Python

# meteo/schema.py
from __future__ import annotations
from dataclasses import dataclass
from typing import List
from influxdb_client import InfluxDBClient
@dataclass(frozen=True)
class MeasurementField:
"""
Représente un champ (_field) d'un measurement InfluxDB.
"""
name: str
type: str # "float", "string", "boolean", "integer", "unsigned"
def list_measurements(client: InfluxDBClient, bucket: str) -> list[str]:
"""
Retourne la liste des measurements présents dans le bucket donné.
Utilise le package Flux `schema.measurements`.
"""
query = f"""
import "influxdata/influxdb/schema"
schema.measurements(bucket: "{bucket}")
"""
query_api = client.query_api()
tables = query_api.query(query)
measurements: set[str] = set()
for table in tables:
for record in table.records:
value = record.get_value()
if isinstance(value, str):
measurements.add(value)
return sorted(measurements)
def list_measurement_fields(
client: InfluxDBClient,
bucket: str,
measurement: str,
) -> list[MeasurementField]:
"""
Retourne la liste des champs (_field) pour un measurement donné,
avec leur type InfluxDB (float, string, boolean, integer, unsigned).
Utilise le package Flux `schema.measurementFieldKeys`.
"""
query = f"""
import "influxdata/influxdb/schema"
schema.measurementFieldKeys(
bucket: "{bucket}",
measurement: "{measurement}",
)
"""
query_api = client.query_api()
tables = query_api.query(query)
fields: dict[str, str] = {}
for table in tables:
for record in table.records:
name = record.get_value()
type_str = str(record.values.get("type", "unknown"))
if isinstance(name, str):
fields[name] = type_str
return [
MeasurementField(name=n, type=t)
for n, t in sorted(fields.items(), key=lambda item: item[0])
]
def list_measurement_tag_keys(
client: InfluxDBClient,
bucket: str,
measurement: str,
) -> list[str]:
"""
Retourne la liste des clés de tags (tag keys) pour un measurement donné.
Utilise `schema.measurementTagKeys`.
"""
query = f"""
import "influxdata/influxdb/schema"
schema.measurementTagKeys(
bucket: "{bucket}",
measurement: "{measurement}",
)
"""
query_api = client.query_api()
tables = query_api.query(query)
keys: set[str] = set()
for table in tables:
for record in table.records:
value = record.get_value()
if isinstance(value, str):
keys.add(value)
return sorted(keys)
def list_measurement_tag_values(
client: InfluxDBClient,
bucket: str,
measurement: str,
tag: str,
) -> list[str]:
"""
Retourne la liste des valeurs possibles pour un tag donné (par exemple
`entity_id`) sur un measurement donné.
Utilise `schema.measurementTagValues`.
"""
query = f"""
import "influxdata/influxdb/schema"
schema.measurementTagValues(
bucket: "{bucket}",
measurement: "{measurement}",
tag: "{tag}",
)
"""
query_api = client.query_api()
tables = query_api.query(query)
values: set[str] = set()
for table in tables:
for record in table.records:
value = record.get_value()
if isinstance(value, str):
values.add(value)
return sorted(values)