From c8b0dae33402b8d2b961f80f4ad6de25c0b4db61 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Fri, 20 Jan 2023 13:36:08 +0100 Subject: [PATCH 1/2] Fix view migration for sqlite --- ...04_add_skipped_state_to_collection_job_.py | 51 +++++++++++++++---- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/lib/galaxy/model/migrations/alembic/versions_gxy/c39f1de47a04_add_skipped_state_to_collection_job_.py b/lib/galaxy/model/migrations/alembic/versions_gxy/c39f1de47a04_add_skipped_state_to_collection_job_.py index 86fd5053e49..f05d819e50f 100644 --- a/lib/galaxy/model/migrations/alembic/versions_gxy/c39f1de47a04_add_skipped_state_to_collection_job_.py +++ b/lib/galaxy/model/migrations/alembic/versions_gxy/c39f1de47a04_add_skipped_state_to_collection_job_.py @@ -5,8 +5,16 @@ Revises: 3100452fa030 Create Date: 2023-01-16 11:53:59.783836 """ -from alembic import op +from typing import Generator + +from alembic import ( + context, + op, +) from alembic_utils.pg_view import PGView +from sqlalchemy import text as sql_text +from sqlalchemy.engine.url import make_url +from sqlalchemy.sql.elements import TextClause from galaxy.model.view import HistoryDatasetCollectionJobStateSummary @@ -53,18 +61,39 @@ GROUP BY jobstates.hdca_id """ +class SqlitePGView(PGView): + def to_sql_statement_create_or_replace(self) -> Generator[TextClause, None, None]: + """Generates a SQL "create or replace view" statement""" + + yield sql_text(f"""DROP VIEW IF EXISTS {self.literal_schema}."{self.signature}";""") + yield sql_text(f"""CREATE VIEW {self.literal_schema}."{self.signature}" AS {self.definition};""") + + +def get_view_instance(definition: str): + + try: + url = make_url(context.config.get_main_option("sqlalchemy.url")) + dialect = url.get_dialect().name + except Exception: + # If someone's doing offline migrations they're probably using postgrea + dialect = "postgresql" + if dialect == "postgresql": + ViewClass = PGView + schema = "public" + elif dialect == "sqlite": + ViewClass = SqlitePGView + schema = "main" + else: + raise Exception(f"Don't know how to generate view for dialect '{dialect}'") + return ViewClass(schema=schema, signature="collection_job_state_summary_view", definition=definition) + + def upgrade(): - public_collection_job_state_summary_view = PGView( - schema="public", - signature="collection_job_state_summary_view", - definition=HistoryDatasetCollectionJobStateSummary.aggregate_state_query, - ) + view = get_view_instance(HistoryDatasetCollectionJobStateSummary.aggregate_state_query) # op.replace_entity comes from alembic_utils plugin - op.replace_entity(public_collection_job_state_summary_view) # type: ignore[attr-defined] + op.replace_entity(view) # type: ignore[attr-defined] def downgrade(): - public_collection_job_state_summary_view = PGView( - schema="public", signature="collection_job_state_summary_view", definition=PREVIOUS_AGGREGATE_QUERY - ) - op.replace_entity(public_collection_job_state_summary_view) # type: ignore[attr-defined] + view = get_view_instance(PREVIOUS_AGGREGATE_QUERY) + op.replace_entity(view) # type: ignore[attr-defined] From 6f65a2675c10b1df100ef3c490ed494fce08488f Mon Sep 17 00:00:00 2001 From: Marius van den Beek Date: Fri, 20 Jan 2023 14:15:34 +0100 Subject: [PATCH 2/2] Fix postgres typo Co-authored-by: Nicola Soranzo --- .../c39f1de47a04_add_skipped_state_to_collection_job_.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/model/migrations/alembic/versions_gxy/c39f1de47a04_add_skipped_state_to_collection_job_.py b/lib/galaxy/model/migrations/alembic/versions_gxy/c39f1de47a04_add_skipped_state_to_collection_job_.py index f05d819e50f..8474c471106 100644 --- a/lib/galaxy/model/migrations/alembic/versions_gxy/c39f1de47a04_add_skipped_state_to_collection_job_.py +++ b/lib/galaxy/model/migrations/alembic/versions_gxy/c39f1de47a04_add_skipped_state_to_collection_job_.py @@ -75,7 +75,7 @@ def get_view_instance(definition: str): url = make_url(context.config.get_main_option("sqlalchemy.url")) dialect = url.get_dialect().name except Exception: - # If someone's doing offline migrations they're probably using postgrea + # If someone's doing offline migrations they're probably using PostgreSQL dialect = "postgresql" if dialect == "postgresql": ViewClass = PGView