fix: add unique constraint on saved_queries.name to prevent duplicates

The migration ran on every deploy, inserting duplicate queries each
time (96 instead of 12). Added UNIQUE constraint on name and changed
ON CONFLICT to reference it. Cleaned up 84 duplicates in DB.
This commit is contained in:
Celes Renata
2026-04-16 05:16:18 +00:00
parent a3b2e97c2c
commit d28787a8ee
+8 -1
View File
@@ -1,4 +1,11 @@
-- Seed pre-built saved queries for the SQL Explorer -- Seed pre-built saved queries for the SQL Explorer
-- Add unique constraint on name to prevent duplicates on re-run
DO $$ BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'saved_queries_name_key') THEN
ALTER TABLE saved_queries ADD CONSTRAINT saved_queries_name_key UNIQUE (name);
END IF;
END $$;
INSERT INTO saved_queries (name, description, sql_text) VALUES INSERT INTO saved_queries (name, description, sql_text) VALUES
('Company Overview', 'All tracked companies with sector and status', ('Company Overview', 'All tracked companies with sector and status',
'SELECT ticker, legal_name, sector, active, created_at FROM companies ORDER BY ticker'), 'SELECT ticker, legal_name, sector, active, created_at FROM companies ORDER BY ticker'),
@@ -35,4 +42,4 @@ INSERT INTO saved_queries (name, description, sql_text) VALUES
('Source Coverage Matrix', 'Active sources per company', ('Source Coverage Matrix', 'Active sources per company',
'SELECT c.ticker, c.legal_name, count(*) FILTER (WHERE s.source_type = ''market_api'') AS market, count(*) FILTER (WHERE s.source_type = ''news_api'') AS news, count(*) FILTER (WHERE s.source_type = ''filings_api'') AS filings, count(*) AS total FROM companies c LEFT JOIN sources s ON c.id = s.company_id AND s.active = TRUE WHERE c.active = TRUE GROUP BY c.ticker, c.legal_name ORDER BY c.ticker') 'SELECT c.ticker, c.legal_name, count(*) FILTER (WHERE s.source_type = ''market_api'') AS market, count(*) FILTER (WHERE s.source_type = ''news_api'') AS news, count(*) FILTER (WHERE s.source_type = ''filings_api'') AS filings, count(*) AS total FROM companies c LEFT JOIN sources s ON c.id = s.company_id AND s.active = TRUE WHERE c.active = TRUE GROUP BY c.ticker, c.legal_name ORDER BY c.ticker')
ON CONFLICT DO NOTHING; ON CONFLICT (name) DO NOTHING;