From 97a95684cf61163fb1b788915157c81c299ab671 Mon Sep 17 00:00:00 2001 From: Per Magnus Petersen Date: Sat, 14 Feb 2026 13:14:28 +0100 Subject: [PATCH] Skip existing prices on insert and add unique index on (time_dk, price_area) Changed upsert to INSERT ON CONFLICT DO NOTHING so existing prices are never overwritten. Added unique index on (time_dk, price_area) to enforce no duplicate quarter-hour entries per area. Co-Authored-By: Claude Opus 4.6 --- ...14130000-add-unique-index-time-dk-price-area.down.sql | 1 + ...0214130000-add-unique-index-time-dk-price-area.up.sql | 1 + resources/queries.sql | 9 +++------ src/clj/pmagnus/elprice/web/controllers/prices.clj | 4 ++-- 4 files changed, 7 insertions(+), 8 deletions(-) create mode 100644 resources/migrations/20260214130000-add-unique-index-time-dk-price-area.down.sql create mode 100644 resources/migrations/20260214130000-add-unique-index-time-dk-price-area.up.sql diff --git a/resources/migrations/20260214130000-add-unique-index-time-dk-price-area.down.sql b/resources/migrations/20260214130000-add-unique-index-time-dk-price-area.down.sql new file mode 100644 index 0000000..7462dc0 --- /dev/null +++ b/resources/migrations/20260214130000-add-unique-index-time-dk-price-area.down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS idx_day_ahead_prices_time_dk_area; diff --git a/resources/migrations/20260214130000-add-unique-index-time-dk-price-area.up.sql b/resources/migrations/20260214130000-add-unique-index-time-dk-price-area.up.sql new file mode 100644 index 0000000..f506b6d --- /dev/null +++ b/resources/migrations/20260214130000-add-unique-index-time-dk-price-area.up.sql @@ -0,0 +1 @@ +CREATE UNIQUE INDEX idx_day_ahead_prices_time_dk_area ON day_ahead_prices (time_dk, price_area); diff --git a/resources/queries.sql b/resources/queries.sql index 3ee1a19..e2ccf51 100644 --- a/resources/queries.sql +++ b/resources/queries.sql @@ -1,11 +1,8 @@ --- :name upsert-price! :! :n --- :doc Upsert a day-ahead price record +-- :name insert-price! :! :n +-- :doc Insert a day-ahead price record, skip if already exists INSERT INTO day_ahead_prices (time_utc, time_dk, price_area, price_dkk, price_eur) VALUES (:time-utc, :time-dk, :price-area, :price-dkk, :price-eur) -ON CONFLICT (time_utc, price_area) DO UPDATE -SET time_dk = EXCLUDED.time_dk, - price_dkk = EXCLUDED.price_dkk, - price_eur = EXCLUDED.price_eur; +ON CONFLICT (time_utc, price_area) DO NOTHING; -- :name get-prices-for-date :? :* -- :doc Get all prices for a given date (time_dk local date) and price area diff --git a/src/clj/pmagnus/elprice/web/controllers/prices.clj b/src/clj/pmagnus/elprice/web/controllers/prices.clj index bfbb558..b4d193f 100644 --- a/src/clj/pmagnus/elprice/web/controllers/prices.clj +++ b/src/clj/pmagnus/elprice/web/controllers/prices.clj @@ -57,10 +57,10 @@ (.replace ^String s "T" " ")))) (defn save-records! - "Upsert price records into the database." + "Insert price records into the database, skipping existing ones." [query-fn records] (doseq [rec records] - (query-fn :upsert-price! + (query-fn :insert-price! {:time-utc (parse-timestamp (:TimeUTC rec)) :time-dk (parse-timestamp (:TimeDK rec)) :price-area (:PriceArea rec)