From c452cdddf77bb9a276a4f8006325ec37b86d05f6 Mon Sep 17 00:00:00 2001 From: nkanaev Date: Sat, 13 Jun 2026 14:53:49 +0100 Subject: [PATCH] postgres migration tweaks --- src/storage/postgres/migration.go | 70 +++++++++++++++---------------- 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/src/storage/postgres/migration.go b/src/storage/postgres/migration.go index e70966d..4002b24 100644 --- a/src/storage/postgres/migration.go +++ b/src/storage/postgres/migration.go @@ -12,6 +12,12 @@ var migrations = []func(*sql.Tx) error{ var maxVersion = int64(len(migrations)) func migrate(db *sql.DB) error { + if _, err := db.Exec( + `create table if not exists schema_version (version bigint primary key)` + ); err != nil { + return err + } + var version int64 err := db.QueryRow( `select coalesce(max(version), 0) from schema_version`, @@ -57,19 +63,15 @@ func migrate(db *sql.DB) error { } func m01_initial(tx *sql.Tx) error { - stmts := []string{ - `create table if not exists schema_version ( - version bigint primary key - )`, - - `create table if not exists folders ( + _, err := tx.Exec(` + create table if not exists folders ( id bigserial primary key, title text not null, is_expanded boolean not null default false - )`, - `create unique index if not exists idx_folder_title on folders(title)`, + ); + create unique index if not exists idx_folder_title on folders(title); - `create table if not exists feeds ( + create table if not exists feeds ( id bigserial primary key, folder_id bigint references folders(id) on delete set null, title text not null, @@ -77,11 +79,11 @@ func m01_initial(tx *sql.Tx) error { link text, feed_link text not null, icon bytea - )`, - `create index if not exists idx_feed_folder_id on feeds(folder_id)`, - `create unique index if not exists idx_feed_feed_link on feeds(feed_link)`, + ); + create index if not exists idx_feed_folder_id on feeds(folder_id); + create unique index if not exists idx_feed_feed_link on feeds(feed_link); - `create table if not exists items ( + create table if not exists items ( id bigserial primary key, guid text not null, feed_id bigint not null references feeds(id) on delete cascade, @@ -93,15 +95,15 @@ func m01_initial(tx *sql.Tx) error { last_arrived timestamptz, status integer, media_links jsonb - )`, - `create index if not exists idx_item_feed_id on items(feed_id)`, - `create index if not exists idx_item__date_id_status on items(date, id, status)`, - `create unique index if not exists idx_item_guid on items(feed_id, guid)`, + ); + create index if not exists idx_item_feed_id on items(feed_id); + create index if not exists idx_item__date_id_status on items(date, id, status); + create unique index if not exists idx_item_guid on items(feed_id, guid); - `alter table items add column if not exists search tsvector`, - `create index if not exists idx_item_search on items using gin(search)`, + alter table items add column if not exists search tsvector; + create index if not exists idx_item_search on items using gin(search); - `create or replace function items_search_update() returns trigger as $$ + create or replace function items_search_update() returns trigger as $$ begin new.search := to_tsvector('english', coalesce(new.title, '') || ' ' || @@ -109,34 +111,28 @@ func m01_initial(tx *sql.Tx) error { ); return new; end; - $$ language plpgsql`, + $$ language plpgsql; - `create trigger if not exists trg_items_search_insert + create trigger if not exists trg_items_search_insert before insert on items - for each row execute function items_search_update()`, + for each row execute function items_search_update(); - `create trigger if not exists trg_items_search_update + create trigger if not exists trg_items_search_update before update of title, content on items - for each row execute function items_search_update()`, + for each row execute function items_search_update(); - `create table if not exists settings ( + create table if not exists settings ( key text primary key, val jsonb - )`, + ); - `create table if not exists feed_states ( + create table if not exists feed_states ( feed_id bigint primary key references feeds(id) on delete cascade, last_refreshed timestamptz not null default '1970-01-01 00:00:00+00', last_error text not null default '', http_lmod text not null default '', http_etag text not null default '' - )`, - } - - for _, stmt := range stmts { - if _, err := tx.Exec(stmt); err != nil { - return err - } - } - return nil + ); + `) + return err }