#35920: Migrate command runs system checks regardless of the value of
requires_system_checks
-------------------------------------+-------------------------------------
Reporter: Jacob Walls | Owner: Jacob
| Walls
Type: Bug | Status: assigned
Component: Core (Management | Version: 5.1
commands) |
Severity: Normal | Resolution:
Keywords: skip-checks | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by Jacob Walls:
Old description:
> Without `--skip-checks=False`, the `migrate` command runs system checks
> regardless of the value of `requires_system_checks`, which is `[]` by
> [https://github.com/django/django/blob/4c452cc377f6f43acd90c6e54826ebd2e6219b0d/django/core/management/commands/migrate.py#L22
> default] (itself a little misleading) but ultimately something I would
> like to be able to override at the project level. The fact that `[]` is
> not respected and not overridable seems like a bug, and AFAIK it's an
> asymmetry with other commands.
>
> ----
>
> - I wrote a system check following the
> [https://docs.djangoproject.com/en/5.1/topics/checks/#field-model-
> manager-template-engine-and-database-checks documented example] inside
> Model.check().
> - I did this as part of a feature adding a new column to my model, and I
> queried this column in my check. I made the necessary migration.
> - During `manage.py migrate` my check ran before my column was added,
> raising `ProgrammingError`.
> - I verified `--skip-checks` works like a charm, but I don't want to
> impose cryptic failures on my fellow developers who expect plain
> `migrate` to work.
> - I attempted to override the `migrate` command in my project, like this:
>
> /app/management/commands/migrate.py
> {{{
> from django.core.checks.registry import registry
> from django.core.management.commands.migrate import Command as
> MigrateCommand
>
> class Command(MigrateCommand):
> # Silence model checks that may depend on new columns.
> requires_system_checks = list(registry.tags_available() - {"models"})
> }}}
>
> - Result: no change: `ProgrammingError`
>
> - Then, I added this patch to Django. (`--skip-checks` still works; here,
> I have to avoid it being added again):
> {{{#!diff
> diff --git a/django/core/management/commands/migrate.py
> b/django/core/management/commands/migrate.py
> index fa420ee6e3..4000d76f3b 100644
> --- a/django/core/management/commands/migrate.py
> +++ b/django/core/management/commands/migrate.py
> @@ -19,14 +19,9 @@ class Command(BaseCommand):
> help = (
> "Updates database schema. Manages both apps with migrations and
> those without."
> )
> - requires_system_checks = []
> + requires_system_checks = "__all__"
>
> def add_arguments(self, parser):
> - parser.add_argument(
> - "--skip-checks",
> - action="store_true",
> - help="Skip system checks.",
> - )
> parser.add_argument(
> "app_label",
> nargs="?",
> @@ -99,7 +94,7 @@ class Command(BaseCommand):
> def handle(self, *args, **options):
> database = options["database"]
> if not options["skip_checks"]:
> - self.check(databases=[database])
> + self.check(tags=self.requires_system_checks,
> databases=[database])
>
> self.verbosity = options["verbosity"]
> self.interactive = options["interactive"]
>
> }}}
>
> - Result: check skipped as expected via my project-level override of the
> migrate command.
>
> ----
>
> I suppose there's another question here about whether `Tags.models`
> checks should run as part of the migrate command, or whether the change I
> made at the project level should be pulled into core, given that this is
> a reasonably realistic scenario for development? I can take that to the
> forum later. But at the moment, I'm just hoping to get the override
> working. Happy to PR this if welcome :-)
New description:
Without `--skip-checks=False`, the `migrate` command runs system checks
regardless of the value of `requires_system_checks`, which is `[]` by
[https://github.com/django/django/blob/4c452cc377f6f43acd90c6e54826ebd2e6219b0d/django/core/management/commands/migrate.py#L22
default] (itself a little misleading) but ultimately something I would
like to be able to override at the project level. The fact that `[]` is
not respected and not overridable seems like a bug, and AFAIK it's an
asymmetry with other commands. (EDIT: turns out, `runserver` behaves in a
similar way, with a
[https://github.com/django/django/blob/c2c7dbb2f88ce8f0ef6d48a61b93866c9926349a/django/core/management/commands/runserver.py#L30
comment from 17 years ago], predating migrations, explaining there is a
separate mechanism from the one that became `requires_system_checks` that
runs the system checks. I think we can improve the story here.)
----
- I wrote a system check following the
[https://docs.djangoproject.com/en/5.1/topics/checks/#field-model-manager-
template-engine-and-database-checks documented example] inside
Model.check().
- I did this as part of a feature adding a new column to my model, and I
queried this column in my check. I made the necessary migration.
- During `manage.py migrate` my check ran before my column was added,
raising `ProgrammingError`.
- I verified `--skip-checks` works like a charm, but I don't want to
impose cryptic failures on my fellow developers who expect plain `migrate`
to work.
- I attempted to override the `migrate` command in my project, like this:
/app/management/commands/migrate.py
{{{
from django.core.checks.registry import registry
from django.core.management.commands.migrate import Command as
MigrateCommand
class Command(MigrateCommand):
# Silence model checks that may depend on new columns.
requires_system_checks = list(registry.tags_available() - {"models"})
}}}
- Result: no change: `ProgrammingError`
- Then, I added this patch to Django. (`--skip-checks` still works; here,
I have to avoid it being added again):
{{{#!diff
diff --git a/django/core/management/commands/migrate.py
b/django/core/management/commands/migrate.py
index fa420ee6e3..4000d76f3b 100644
--- a/django/core/management/commands/migrate.py
+++ b/django/core/management/commands/migrate.py
@@ -19,14 +19,9 @@ class Command(BaseCommand):
help = (
"Updates database schema. Manages both apps with migrations and
those without."
)
- requires_system_checks = []
+ requires_system_checks = "__all__"
def add_arguments(self, parser):
- parser.add_argument(
- "--skip-checks",
- action="store_true",
- help="Skip system checks.",
- )
parser.add_argument(
"app_label",
nargs="?",
@@ -99,7 +94,7 @@ class Command(BaseCommand):
def handle(self, *args, **options):
database = options["database"]
if not options["skip_checks"]:
- self.check(databases=[database])
+ self.check(tags=self.requires_system_checks,
databases=[database])
self.verbosity = options["verbosity"]
self.interactive = options["interactive"]
}}}
- Result: check skipped as expected via my project-level override of the
migrate command.
----
I suppose there's another question here about whether `Tags.models` checks
should run as part of the migrate command, or whether the change I made at
the project level should be pulled into core, given that this is a
reasonably realistic scenario for development? I can take that to the
forum later. But at the moment, I'm just hoping to get the override
working. Happy to PR this if welcome :-)
--
--
Ticket URL: <https://code.djangoproject.com/ticket/35920#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/django-updates/0107019347409650-a7f314ac-258d-43e5-8aa6-ef6e04d5278d-000000%40eu-central-1.amazonses.com.