weather-station/internal/database/radar_weather.go
2025-09-23 15:15:46 +08:00

71 lines
1.9 KiB
Go

package database
import (
"context"
"database/sql"
"fmt"
"time"
)
// UpsertRadarWeather stores a realtime snapshot for a radar station.
// Table schema (expected):
//
// CREATE TABLE IF NOT EXISTS radar_weather (
// id SERIAL PRIMARY KEY,
// alias TEXT NOT NULL,
// lat DOUBLE PRECISION NOT NULL,
// lon DOUBLE PRECISION NOT NULL,
// dt TIMESTAMPTZ NOT NULL,
// temperature DOUBLE PRECISION,
// humidity DOUBLE PRECISION,
// cloudrate DOUBLE PRECISION,
// visibility DOUBLE PRECISION,
// dswrf DOUBLE PRECISION,
// wind_speed DOUBLE PRECISION,
// wind_direction DOUBLE PRECISION,
// pressure DOUBLE PRECISION,
// created_at TIMESTAMPTZ DEFAULT now()
// );
// CREATE UNIQUE INDEX IF NOT EXISTS radar_weather_udx ON radar_weather(alias, dt);
func UpsertRadarWeather(
ctx context.Context,
db *sql.DB,
alias string,
lat, lon float64,
dt time.Time,
temperature, humidity, cloudrate, visibility, dswrf, windSpeed, windDir, pressure float64,
) error {
const q = `
INSERT INTO radar_weather (
alias, lat, lon, dt,
temperature, humidity, cloudrate, visibility, dswrf,
wind_speed, wind_direction, pressure
) VALUES (
$1,$2,$3,$4,
$5,$6,$7,$8,$9,
$10,$11,$12
)
ON CONFLICT (alias, dt)
DO UPDATE SET
lat = EXCLUDED.lat,
lon = EXCLUDED.lon,
temperature = EXCLUDED.temperature,
humidity = EXCLUDED.humidity,
cloudrate = EXCLUDED.cloudrate,
visibility = EXCLUDED.visibility,
dswrf = EXCLUDED.dswrf,
wind_speed = EXCLUDED.wind_speed,
wind_direction = EXCLUDED.wind_direction,
pressure = EXCLUDED.pressure`
_, err := db.ExecContext(ctx, q,
alias, lat, lon, dt,
temperature, humidity, cloudrate, visibility, dswrf,
windSpeed, windDir, pressure,
)
if err != nil {
return fmt.Errorf("upsert radar_weather (%s %s): %w", alias, dt.Format(time.RFC3339), err)
}
return nil
}