71 lines
1.9 KiB
Go
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
|
|
}
|