Sunday, July 28, 2019

Re: Running pending migrations in Middleware

Yes, I do see several problems. Some of them:

- All middleware are run for every request
- What you're doing can slow down your request response time to minutes, depending on home many migrations you have
- Depending on your database, migrations might not be atomic thus causing conflicts
- You have no way to intervene when something goes south
- ...

I can elaborate in more detail when you want. But please, don't run migrations as part of the request-response cycle.

/Markus

On Sun, Jul 28, 2019, at 3:48 PM, David Grant wrote:
> Anyone see any problems with running migrations in Middleware?
>
> import logging
> import os
> import time
>
> from django.core.management import call_command
> from django.http import HttpResponse
>
> from products.models.models import AppVersion
>
> LOG = logging.getLogger(__name__)
>
>
> # Used for testing locally when the GAE_VERSION environment is not set
> FAKE_VERSION_TESTING = 8
>
>
> class MigrateMiddleware:
>
> def __init__(self, get_response):
> self.get_response = get_response
>
> def __call__(self, request):
> start_time = time.time()
> try:
> LOG.info("Running migrate middleware")
> # Figure out what version of our app is now deployed
> app_version, created =
> AppVersion.objects.get_or_create(version=os.getenv('GAE_VERSION',
> FAKE_VERSION_TESTING))
> if not app_version.migrations_succeeded or created:
> # Previous attempt at this deployed version failed, or this was
> a new deployment.
> try:
> call_command('migrate')
> except:
> return HttpResponse("Running a Django migration
> failed! Investigate.", status=500)
> app_version.migrations_succeeded = True
> app_version.save()
> finally:
> LOG.info("Took: %ss", time.time() - start_time)
> return self.get_response(request)
>
>
> It seems to work just fine in a quick test.
>
> --
> You received this message because you are subscribed to the Google
> Groups "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to django-users+unsubscribe@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/bdfd6393-6d68-4285-b5a6-eb1be98ef467%40googlegroups.com <https://groups.google.com/d/msgid/django-users/bdfd6393-6d68-4285-b5a6-eb1be98ef467%40googlegroups.com?utm_medium=email&utm_source=footer>.

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/3d2c95c8-3fe6-4890-8c06-2206ad72c7b0%40www.fastmail.com.

No comments:

Post a Comment