Fix db_init for non-owner DB users

ALTER TABLE, CREATE INDEX and CREATE OR REPLACE FUNCTION all require table/function
ownership in PostgreSQL. Replace IF NOT EXISTS DDL with explicit existence checks so
db_init works for unprivileged application users where the schema was created by a
different role (e.g. postgres).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 08:58:46 +00:00
parent 88ef0d6943
commit 94bfc60fc4

33
main.py
View File

@@ -411,21 +411,30 @@ def db_init(cur):
updated_ts timestamptz NOT NULL DEFAULT now() updated_ts timestamptz NOT NULL DEFAULT now()
); );
""") """)
for col, typedef in [
("needs_ocr_backfill", "boolean NOT NULL DEFAULT false"),
("needs_exif_backfill", "boolean NOT NULL DEFAULT false"),
]:
cur.execute(""" cur.execute("""
ALTER TABLE remote_cam.import_job SELECT 1 FROM information_schema.columns
ADD COLUMN IF NOT EXISTS needs_ocr_backfill boolean NOT NULL DEFAULT false; WHERE table_schema='remote_cam' AND table_name='import_job' AND column_name=%s
""") """, (col,))
cur.execute(""" if not cur.fetchone():
ALTER TABLE remote_cam.import_job cur.execute(f"ALTER TABLE remote_cam.import_job ADD COLUMN {col} {typedef};")
ADD COLUMN IF NOT EXISTS needs_exif_backfill boolean NOT NULL DEFAULT false; for idx, col in [
""") ("import_job_needs_ocr_idx", "needs_ocr_backfill"),
cur.execute("CREATE INDEX IF NOT EXISTS import_job_needs_ocr_idx ON remote_cam.import_job(needs_ocr_backfill);") ("import_job_needs_exif_idx", "needs_exif_backfill"),
cur.execute("CREATE INDEX IF NOT EXISTS import_job_needs_exif_idx ON remote_cam.import_job(needs_exif_backfill);") ("import_job_status_idx", "status"),
cur.execute("CREATE INDEX IF NOT EXISTS import_job_status_idx ON remote_cam.import_job(status);") ("import_job_updated_idx", "updated_ts"),
cur.execute("CREATE INDEX IF NOT EXISTS import_job_updated_idx ON remote_cam.import_job(updated_ts);") ]:
cur.execute("SELECT 1 FROM pg_indexes WHERE schemaname='remote_cam' AND indexname=%s", (idx,))
if not cur.fetchone():
cur.execute(f"CREATE INDEX {idx} ON remote_cam.import_job({col});")
cur.execute("SELECT 1 FROM pg_proc JOIN pg_namespace ON pg_proc.pronamespace=pg_namespace.oid WHERE nspname='remote_cam' AND proname='set_updated_ts'")
if not cur.fetchone():
cur.execute(""" cur.execute("""
CREATE OR REPLACE FUNCTION remote_cam.set_updated_ts() CREATE FUNCTION remote_cam.set_updated_ts()
RETURNS trigger AS $$ RETURNS trigger AS $$
BEGIN BEGIN
NEW.updated_ts = now(); NEW.updated_ts = now();