postgres migration tweaks

This commit is contained in:
nkanaev
2026-06-13 14:53:49 +01:00
parent d4766429cf
commit c452cdddf7

View File

@@ -12,6 +12,12 @@ var migrations = []func(*sql.Tx) error{
var maxVersion = int64(len(migrations)) var maxVersion = int64(len(migrations))
func migrate(db *sql.DB) error { 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 var version int64
err := db.QueryRow( err := db.QueryRow(
`select coalesce(max(version), 0) from schema_version`, `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 { func m01_initial(tx *sql.Tx) error {
stmts := []string{ _, err := tx.Exec(`
`create table if not exists schema_version ( create table if not exists folders (
version bigint primary key
)`,
`create table if not exists folders (
id bigserial primary key, id bigserial primary key,
title text not null, title text not null,
is_expanded boolean not null default false 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, id bigserial primary key,
folder_id bigint references folders(id) on delete set null, folder_id bigint references folders(id) on delete set null,
title text not null, title text not null,
@@ -77,11 +79,11 @@ func m01_initial(tx *sql.Tx) error {
link text, link text,
feed_link text not null, feed_link text not null,
icon bytea icon bytea
)`, );
`create index if not exists idx_feed_folder_id on feeds(folder_id)`, 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 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, id bigserial primary key,
guid text not null, guid text not null,
feed_id bigint not null references feeds(id) on delete cascade, 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, last_arrived timestamptz,
status integer, status integer,
media_links jsonb media_links jsonb
)`, );
`create index if not exists idx_item_feed_id on items(feed_id)`, 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 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 unique index if not exists idx_item_guid on items(feed_id, guid);
`alter table items add column if not exists search tsvector`, alter table items add column if not exists search tsvector;
`create index if not exists idx_item_search on items using gin(search)`, 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 begin
new.search := to_tsvector('english', new.search := to_tsvector('english',
coalesce(new.title, '') || ' ' || coalesce(new.title, '') || ' ' ||
@@ -109,34 +111,28 @@ func m01_initial(tx *sql.Tx) error {
); );
return new; return new;
end; 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 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 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, key text primary key,
val jsonb 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, 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_refreshed timestamptz not null default '1970-01-01 00:00:00+00',
last_error text not null default '', last_error text not null default '',
http_lmod text not null default '', http_lmod text not null default '',
http_etag text not null default '' http_etag text not null default ''
)`, );
} `)
return err
for _, stmt := range stmts {
if _, err := tx.Exec(stmt); err != nil {
return err
}
}
return nil
} }