Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -311,9 +311,8 @@ checks existing materialized view definition in the database (if the mat. view e
definition with the one currently defined in your `pg.MaterializedView` subclass. If the definition matches
exactly, the re-create of materialized view is skipped.

This feature is enabled by setting the `MATERIALIZED_VIEWS_CHECK_SQL_CHANGED` in your Django settings to `True`,
which enables the feature when running `migrate`. The command `sync_pgviews` uses this setting as well,
however it also has switches `--enable-materialized-views-check-sql-changed` and
This feature is on by default (as of version 1.0), it can be disabled by setting the `MATERIALIZED_VIEWS_CHECK_SQL_CHANGED` in your Django settings to `False`.
The command `sync_pgviews` uses this setting as well, however, it also has switches `--enable-materialized-views-check-sql-changed` and
`--disable-materialized-views-check-sql-changed` which override this setting for that command.

This feature also takes into account indexes. When a view is deemed not needing recreating, the process will still
Expand Down
2 changes: 1 addition & 1 deletion django_pgviews/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def sync_pgviews(self, sender: Any, app_config: apps.AppConfig, using: str, **kw
vs.run(
force=True,
update=True,
materialized_views_check_sql_changed=getattr(settings, "MATERIALIZED_VIEWS_CHECK_SQL_CHANGED", False),
materialized_views_check_sql_changed=getattr(settings, "MATERIALIZED_VIEWS_CHECK_SQL_CHANGED", True),
using=using,
)
self.counter = 0
Expand Down
6 changes: 3 additions & 3 deletions django_pgviews/management/commands/sync_pgviews.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def add_arguments(self, parser: ArgumentParser) -> None:
help=(
"Before recreating materialized view, check the SQL has changed compared to the currently active "
"materialized view in the database, if there is one, and only re-create the materialized view "
"if the SQL is different. By default uses django setting MATERIALIZED_VIEWS_CHECK_SQL_CHANGED."
"if the SQL is different. By default uses Django setting MATERIALIZED_VIEWS_CHECK_SQL_CHANGED."
),
)
parser.add_argument(
Expand All @@ -47,7 +47,7 @@ def add_arguments(self, parser: ArgumentParser) -> None:
help=(
"Before recreating materialized view, check the SQL has changed compared to the currently active "
"materialized view in the database, if there is one, and only re-create the materialized view "
"if the SQL is different. By default uses django setting MATERIALIZED_VIEWS_CHECK_SQL_CHANGED."
"if the SQL is different. By default uses Django setting MATERIALIZED_VIEWS_CHECK_SQL_CHANGED."
),
)
parser.add_argument(
Expand All @@ -62,7 +62,7 @@ def handle(
vs = ViewSyncer()

if materialized_views_check_sql_changed is None:
materialized_views_check_sql_changed = getattr(settings, "MATERIALIZED_VIEWS_CHECK_SQL_CHANGED", False)
materialized_views_check_sql_changed = getattr(settings, "MATERIALIZED_VIEWS_CHECK_SQL_CHANGED", True)

vs.run(
force=force,
Expand Down
2 changes: 1 addition & 1 deletion django_pgviews/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def run(self, **kwargs: Any) -> bool:
force: bool = kwargs["force"]
update: bool = kwargs["update"]
using: str = kwargs["using"]
materialized_views_check_sql_changed: bool = kwargs.get("materialized_views_check_sql_changed", False)
materialized_views_check_sql_changed: bool = kwargs.get("materialized_views_check_sql_changed", True)

if super().run(
force=force,
Expand Down
7 changes: 6 additions & 1 deletion tests/test_project/schemadbtest/test_schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from django.core.management import call_command
from django.db import DEFAULT_DB_ALIAS, connections
from django.dispatch import receiver
from pytest_django.fixtures import SettingsWrapper

from django_pgviews.signals import view_synced
from tests.test_project.schemadbtest.models import (
Expand Down Expand Up @@ -96,7 +97,11 @@ def test_mat_view_refresh(self):
SchemaMonthlyObservationMaterializedView.refresh()
assert SchemaMonthlyObservationMaterializedView.objects.count() == 1

def test_view_exists_on_sync(self):
@pytest.fixture(autouse=True)
def check_sql_changed_disabled(self, settings: SettingsWrapper):
settings.MATERIALIZED_VIEWS_CHECK_SQL_CHANGED = False

def test_view_exists_on_sync(self) -> None:
synced = []

@receiver(view_synced)
Expand Down
12 changes: 9 additions & 3 deletions tests/test_project/viewtest/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,9 @@ def test_materialized_view_with_no_data_after_refresh(self):

assert models.MaterializedRelatedViewWithNoData.objects.count() == 1, "Materialized view should have updated"

def test_signals(self):
def test_signals(self, settings: SettingsWrapper):
settings.MATERIALIZED_VIEWS_CHECK_SQL_CHANGED = False

expected = {
models.MaterializedRelatedView: {"status": "UPDATED", "has_changed": True},
models.Superusers: {"status": "EXISTS", "has_changed": False},
Expand Down Expand Up @@ -252,7 +254,9 @@ def test_get_sql(self):

assert LatestSuperusers.objects.count() == 1

def test_sync_pgviews_materialized_views_check_sql_changed(self):
def test_sync_pgviews_materialized_views_check_sql_changed_disabled(self, settings: SettingsWrapper):
settings.MATERIALIZED_VIEWS_CHECK_SQL_CHANGED = False

assert models.TestModel.objects.count() == 0, "Test started with non-empty TestModel"
assert models.MaterializedRelatedView.objects.count() == 0, "Test started with non-empty mat view"

Expand Down Expand Up @@ -282,7 +286,9 @@ def test_sync_pgviews_materialized_views_check_sql_changed(self):
call_command("sync_pgviews", update=False, materialized_views_check_sql_changed=True)
assert models.MaterializedRelatedView.objects.count() == 2

def test_migrate_materialized_views_check_sql_changed_default(self):
def test_migrate_materialized_views_check_sql_changed_disabled(self, settings: SettingsWrapper):
settings.MATERIALIZED_VIEWS_CHECK_SQL_CHANGED = False

assert models.TestModel.objects.count() == 0, "Test started with non-empty TestModel"
assert models.MaterializedRelatedView.objects.count() == 0, "Test started with non-empty mat view"

Expand Down