You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kmftools/solarforecast/backend/db.py

98 lines
2.9 KiB

import os
import mysql.connector
from dotenv import load_dotenv
from datetime import datetime
load_dotenv(dotenv_path="../.env")
db_config = {
"host": os.getenv("MYSQL_HOST"),
"port": int(os.getenv("MYSQL_PORT")),
"user": os.getenv("MYSQL_USER"),
"password": os.getenv("MYSQL_PASSWORD"),
"database": os.getenv("MYSQL_DATABASE"),
}
def parse_datetime_safe(dt_string):
try:
return datetime.fromisoformat(dt_string.replace("Z", "").replace("+00:00", ""))
except Exception:
return None
def parse_float_safe(value):
try:
return float(value)
except Exception:
return None
def init_db():
"""Creëer ruwe datatabel met unieke forecast_time."""
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS solar_raw_data (
id INT AUTO_INCREMENT PRIMARY KEY,
forecast_time DATETIME NOT NULL UNIQUE,
valid_to DATETIME,
capacity FLOAT,
volume FLOAT,
percentage FLOAT,
emission FLOAT,
emission_factor FLOAT,
last_update DATETIME
)
""")
conn.commit()
cursor.close()
conn.close()
def insert_forecast_records(records):
"""Voegt ruwe forecast records toe, met veilige parsing en validatie."""
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
# Haal reeds bekende timestamps op
cursor.execute("SELECT forecast_time FROM solar_raw_data")
existing_timestamps = set(row[0] for row in cursor.fetchall())
new_rows = 0
for record in records:
forecast_time = parse_datetime_safe(record.get("validfrom", ""))
if not forecast_time or forecast_time in existing_timestamps:
continue
try:
cursor.execute("""
INSERT INTO solar_raw_data (
forecast_time,
valid_to,
capacity,
volume,
percentage,
emission,
emission_factor,
last_update
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
""", (
forecast_time,
parse_datetime_safe(record.get("validto")),
parse_float_safe(record.get("capacity")),
parse_float_safe(record.get("volume")),
parse_float_safe(record.get("percentage")),
parse_float_safe(record.get("emission")),
parse_float_safe(record.get("emissionfactor")),
parse_datetime_safe(record.get("lastupdate"))
))
new_rows += 1
except Exception as e:
print(f"❌ Fout bij record: {e}\nRecord: {record}")
conn.commit()
cursor.close()
conn.close()
print(f"{new_rows} nieuwe records opgeslagen.")