Squashed migration

97 views
Skip to first unread message

Cherie Pun

unread,
Jun 12, 2015, 9:38:48 AM6/12/15
to django...@googlegroups.com
Hi,

I have trying to experiment with squashmigration to see if it will make it faster to build the database when running tests. So I have squashed the migrations following the instructions on the Django website. However when I run the tests, it still uses the original migrations. I thought Django automatically uses the squashed one over the separated ones. Is there some settings that I have to configure? Also, it says that no optimisation was available even though there are a few AddField which should in theory be combined into AddModel.

Any help or suggestions will be much appreciated, thanks!

Cherie

Erik Cederstrand

unread,
Jun 12, 2015, 11:16:50 AM6/12/15
to Django Users

Den 12/06/2015 kl. 11.38 skrev Cherie Pun <cherie...@gmail.com>:

Hi,

I have trying to experiment with squashmigration to see if it will make it faster to build the database when running tests. So I have squashed the migrations following the instructions on the Django website. However when I run the tests, it still uses the original migrations. I thought Django automatically uses the squashed one over the separated ones. Is there some settings that I have to configure? Also, it says that no optimisation was available even though there are a few AddField which should in theory be combined into AddModel.

squashmigrations has limits to what it can do. You are free to edit the migration by hand if you can spot any more optimizations, and file a bug report if you spot something that the squasher should reasonably detect.

Have you seen the new "manage.py test --keepdb" in Django 1.8? I have a complicated project with lots of apps and use it daily to speed up testing. https://docs.djangoproject.com/en/1.8/ref/django-admin/#test-app-or-test-identifier

Erik

Filipe Ximenes

unread,
Jun 12, 2015, 11:17:38 AM6/12/15
to Django Users
Hi Cherie, maybe you can run your tests without the migrations. This django app may solve your problem: https://github.com/henriquebastos/django-test-without-migrations/

--
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...@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/9288958d-0214-4cd2-9b51-dd173a8e83ae%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--
  
Filipe Ximenes
+55 (81) 8245-9204
Vinta Software Studio
http://www.vinta.com.br

Cherie Pun

unread,
Jun 12, 2015, 12:32:39 PM6/12/15
to django...@googlegroups.com
Hi,

Thanks for your replies! I am still on Django 1.7 but we are hoping to upgrade to 1.8 soon. I manage to use the squashed migrations when creating the test database now, but there's syntax error in the automatically generated squash migration. The error occurs on the line on which it reference the user-defined functions in other migrations. It seems fine when it ran the first methods though.

Cheers,
Cherie

aRkadeFR

unread,
Jun 12, 2015, 12:34:55 PM6/12/15
to django...@googlegroups.com
Hey,

You need to delete your old migrations so it uses only the squashed
one after.

In the documentation:
"This enables you to squash and not mess up systems currently in production that aren’t fully up-to-date yet. The recommended process is to squash, keeping the old files, commit and release, wait until all systems are upgraded with the new release (or if you’re a third-party project, just ensure your users upgrade releases in order without skipping any), and then remove the old files, commit and do a second release."

https://docs.djangoproject.com/en/1.8/topics/migrations/#squashing-migrations
--
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...@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/9288958d-0214-4cd2-9b51-dd173a8e83ae%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

-- 
aRkadeFR

Carl Meyer

unread,
Jun 12, 2015, 3:43:22 PM6/12/15
to django...@googlegroups.com
On 06/12/2015 06:32 AM, aRkadeFR wrote:
> You need to delete your old migrations so it uses only the squashed
> one after.

No, the squashed migration should be used in place of the old ones for
any new database, even if the old ones are still present. This is the
point of the squashmigrations feature; that you can keep the old ones
around (which is necessary for any deployments that may not yet have
applied all of them) while still gaining the benefit of the new squashed
migration for new deployments (and tests).

I know this works, because I just did it recently myself. It sounds like
Cherie was able to get it working too, though we didn't get any
clarification on why it didn't seem to work originally.

> In the documentation:
> "This enables you to squash and not mess up systems currently in
> production that aren’t fully up-to-date yet. The recommended process is
> to squash, keeping the old files, commit and release, wait until all
> systems are upgraded with the new release (or if you’re a third-party
> project, just ensure your users upgrade releases in order without
> skipping any), and then remove the old files, commit and do a second
> release."

That's right. The length of time you need to wait before removing can
vary widely. For a third-party app, it may be a full release cycle or
two (as long as you can tell your users to upgrade version-by-version).
For a project with only a few deployments, all under your control, it
may be the same day. But regardless, the squashed migration will still
be used in tests immediately, before you remove the old migrations.

Carl

signature.asc

Carl Meyer

unread,
Jun 12, 2015, 3:44:40 PM6/12/15
to django...@googlegroups.com
Hi Cherie,

On 06/12/2015 06:32 AM, Cherie Pun wrote:
> Thanks for your replies! I am still on Django 1.7 but we are hoping to
> upgrade to 1.8 soon. I manage to use the squashed migrations when
> creating the test database now,

Do you know why it didn't work initially? That'd be useful to know, in
case it's something that might trip up other users, too.

> but there's syntax error in the
> automatically generated squash migration. The error occurs on the line
> on which it reference the user-defined functions in other migrations. It
> seems fine when it ran the first methods though.

That sounds like a probably-fixable bug (though it may already be fixed
in 1.8 and/or master). If you're able to reproduce the bug on master,
please do file a ticket for it.

Carl

signature.asc

aRkadeFR

unread,
Jun 15, 2015, 8:54:09 AM6/15/15
to django...@googlegroups.com
Thanks for the good explanation as always :)

From the documentation plus the explanation of the problem,
I wanted to know if by deleting the old migration it would still
run the old migrations.

Do we know the end of the story? Where it comes from?

Thanks
--
aRkadeFR

Cherie Pun

unread,
Jun 15, 2015, 12:18:05 PM6/15/15
to django...@googlegroups.com, con...@arkade.info
Hi,

So the original problem was that I was running in the repo which didn't have the squashed migration. Django does know when to switch to the squashed migrations when you have both squashed and unsquashed migration files coexist in the folder.
As for the syntax error it was because python cannot import from modules that starts with numbers. Also, the idea was that we shouldn't use the migration files as modules to import code from, that's why the file name stayed as it was. Users should manually move their RunPython methods manually and resolve those invalid references to migration files.

Hope this helps and sorry for confusing people that squash migration doesn't work! I am still new to Python and Django and I really appreciate everyone's replies.

Cheers,
Cherie

aRkadeFR

unread,
Jun 15, 2015, 12:48:43 PM6/15/15
to django...@googlegroups.com
Great.

Thanks for the feedback :)
--
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...@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.

For more options, visit https://groups.google.com/d/optout.

-- 
aRkadeFR
Reply all
Reply to author
Forward
0 new messages