88 lines
2.2 KiB
Markdown
88 lines
2.2 KiB
Markdown
# SPC Outlook Postgres Schema Transition
|
|
|
|
## Purpose
|
|
|
|
This document describes how to reset existing Postgres outlook tables from the
|
|
`weather.outlook.v1` storage shape to the `weather.outlook.v2` compatible
|
|
storage shape.
|
|
|
|
Updated `weatherfeeder` versions create outlook tables with run-level
|
|
discussion storage. Existing databases that already contain the old outlook
|
|
table family need a manual reset because the Postgres sink creates tables with
|
|
`CREATE TABLE IF NOT EXISTS`.
|
|
|
|
## Scope
|
|
|
|
This reset drops only the outlook table family and lets updated `weatherfeeder`
|
|
recreate it:
|
|
|
|
- `outlook_discussions`
|
|
- `outlooks`
|
|
- `outlook_runs`
|
|
|
|
Other weather tables are not affected.
|
|
|
|
## Warning
|
|
|
|
These commands delete stored SPC outlook history. Existing `weather.outlook.v1`
|
|
outlook rows are intentionally removed. Downstream readers should be updated
|
|
intentionally for the new outlook shape.
|
|
|
|
## Deployment Order
|
|
|
|
1. Stop `weatherfeeder`.
|
|
2. Drop the existing outlook tables.
|
|
3. Deploy updated `weatherfeeder`.
|
|
4. Start `weatherfeeder` so the Postgres sink recreates the new outlook tables.
|
|
5. Deploy updated downstream consumers such as `weatherapi`.
|
|
|
|
## Reset SQL
|
|
|
|
```sql
|
|
DROP TABLE IF EXISTS outlook_discussions;
|
|
DROP TABLE IF EXISTS outlooks;
|
|
DROP TABLE IF EXISTS outlook_runs;
|
|
```
|
|
|
|
## Verification SQL
|
|
|
|
Before or after the updated daemon starts, this query shows which outlook tables
|
|
exist:
|
|
|
|
```sql
|
|
SELECT table_name
|
|
FROM information_schema.tables
|
|
WHERE table_name IN ('outlook_runs', 'outlooks', 'outlook_discussions')
|
|
ORDER BY table_name;
|
|
```
|
|
|
|
After the updated daemon has started and recreated the tables, verify the new
|
|
run column:
|
|
|
|
```sql
|
|
SELECT column_name, is_nullable, data_type
|
|
FROM information_schema.columns
|
|
WHERE table_name = 'outlook_runs'
|
|
AND column_name = 'discussion_count';
|
|
```
|
|
|
|
Verify the discussion table indexes:
|
|
|
|
```sql
|
|
SELECT indexname
|
|
FROM pg_indexes
|
|
WHERE tablename = 'outlook_discussions'
|
|
ORDER BY indexname;
|
|
```
|
|
|
|
Verify that legacy polygon-level prose columns are gone from `outlooks`:
|
|
|
|
```sql
|
|
SELECT column_name
|
|
FROM information_schema.columns
|
|
WHERE table_name = 'outlooks'
|
|
AND column_name IN ('headline', 'summary', 'discussion');
|
|
```
|
|
|
|
The final query should return zero rows.
|