Skip to content

Commit 31facf7

Browse files
authored
Merge pull request #577 from DataIntegrationGroup/fix/pg-cron-optional
pg_cron should be optional for local development
2 parents 75c2ddf + e4cd4e3 commit 31facf7

3 files changed

Lines changed: 23 additions & 21 deletions

File tree

alembic/versions/d5e6f7a8b9c0_create_pygeoapi_supporting_views.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -314,12 +314,8 @@ def upgrade() -> None:
314314
")"
315315
)
316316
).scalar()
317-
if not pg_cron_available:
318-
raise RuntimeError(
319-
"Cannot schedule nightly pygeoapi materialized view refresh job: "
320-
"pg_cron extension is not available on this PostgreSQL server."
321-
)
322-
op.execute(text("CREATE EXTENSION IF NOT EXISTS pg_cron"))
317+
if pg_cron_available:
318+
op.execute(text("CREATE EXTENSION IF NOT EXISTS pg_cron"))
323319

324320
for view_id, thing_type in THING_COLLECTIONS:
325321
safe_view_id = _safe_view_id(view_id)
@@ -364,11 +360,21 @@ def upgrade() -> None:
364360
_create_matview_indexes()
365361

366362
op.execute(text(_create_refresh_function()))
367-
op.execute(text(_schedule_refresh_job()))
363+
if pg_cron_available:
364+
op.execute(text(_schedule_refresh_job()))
368365

369366

370367
def downgrade() -> None:
371-
op.execute(text(_unschedule_refresh_job()))
368+
bind = op.get_bind()
369+
pg_cron_available = bind.execute(
370+
text(
371+
"SELECT EXISTS ("
372+
"SELECT 1 FROM pg_available_extensions WHERE name = 'pg_cron'"
373+
")"
374+
)
375+
).scalar()
376+
if pg_cron_available:
377+
op.execute(text(_unschedule_refresh_job()))
372378
op.execute(text(f"DROP FUNCTION IF EXISTS public.{REFRESH_FUNCTION_NAME}()"))
373379
_drop_view_or_materialized_view("ogc_avg_tds_wells")
374380
_drop_view_or_materialized_view("ogc_latest_depth_to_water_wells")

core/initializers.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,8 @@ def erase_and_rebuild_db():
7373
")"
7474
)
7575
).scalar()
76-
if not pg_cron_available:
77-
raise RuntimeError(
78-
"Cannot erase and rebuild database: pg_cron extension is not "
79-
"available on this PostgreSQL server."
80-
)
81-
session.execute(text("CREATE EXTENSION IF NOT EXISTS pg_cron"))
76+
if pg_cron_available:
77+
session.execute(text("CREATE EXTENSION IF NOT EXISTS pg_cron"))
8278
session.commit()
8379
Base.metadata.drop_all(session.bind)
8480
Base.metadata.create_all(session.bind)

db/initialization.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import os
44

5-
from sqlalchemy import text
5+
from sqlalchemy import inspect as sa_inspect, text
66
from sqlalchemy.engine import Connection
77
from sqlalchemy.orm import Session
88
from sqlalchemy_searchable import sync_trigger
@@ -69,12 +69,8 @@ def recreate_public_schema(session: Session) -> None:
6969
")"
7070
)
7171
).scalar()
72-
if not pg_cron_available:
73-
raise RuntimeError(
74-
"Cannot initialize database schema: pg_cron extension is not available "
75-
"on this PostgreSQL server."
76-
)
77-
session.execute(text("CREATE EXTENSION IF NOT EXISTS pg_cron"))
72+
if pg_cron_available:
73+
session.execute(text("CREATE EXTENSION IF NOT EXISTS pg_cron"))
7874
session.execute(APP_READ_GRANT_SQL)
7975
grant_app_read_members(session)
8076
session.commit()
@@ -83,7 +79,11 @@ def recreate_public_schema(session: Session) -> None:
8379
def sync_search_vector_triggers(session: Session) -> None:
8480
"""Ensure SQLAlchemy-searchable triggers exist for every TSVector column."""
8581
conn = session.connection()
82+
inspector = sa_inspect(conn)
83+
existing_tables = set(inspector.get_table_names())
8684
for table in Base.metadata.tables.values():
85+
if table.name not in existing_tables:
86+
continue
8787
for column in table.columns:
8888
if isinstance(column.type, TSVectorType):
8989
sync_trigger(conn, table.name, column.name, list(column.type.columns))

0 commit comments

Comments
 (0)