]> git.ipfire.org Git - thirdparty/patchwork.git/commitdiff
migrations: Optimize 0007 migration
authorAndy Doan <andy.doan@linaro.org>
Thu, 24 Mar 2016 18:20:43 +0000 (13:20 -0500)
committerStephen Finucane <stephen.finucane@intel.com>
Fri, 25 Mar 2016 11:00:44 +0000 (11:00 +0000)
By handling comment copying/deletion via SQL we can make migration take
< 3 minutes rather than > 30 minutes for big instances. The SQL used is
vendor specific, but covers the two DBs supported by Patchwork.

Signed-off-by: Andy Doan <andy.doan@linaro.org>
Reviewed-by: Stephen Finucane <stephen.finucane@intel.com>
patchwork/migrations/0007_move_comment_content_to_patch_content.py

index 63d57baeea72a4705324c03fa3a7fcf768d82d7d..43c135ea3c26b4c729958356308ca6f0187b285c 100644 (file)
@@ -1,47 +1,75 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 
-from django.db import migrations
+from django.db import connection, migrations
 
 
 def copy_comment_field(apps, schema_editor):
-    Comment = apps.get_model('patchwork', 'Comment')
-    Patch = apps.get_model('patchwork', 'Patch')
+    if connection.vendor == 'postgresql':
+        schema_editor.execute('''
+            UPDATE patchwork_patch
+              SET content = patchwork_comment.content
+            FROM patchwork_comment
+              WHERE patchwork_patch.id=patchwork_comment.patch_id
+                    AND patchwork_patch.msgid=patchwork_comment.msgid
+        ''')
+    elif connection.vendor == 'mysql':
+        schema_editor.execute('''
+            UPDATE patchwork_patch, patchwork_comment
+              SET patchwork_patch.content = patchwork_comment.content
+            WHERE patchwork_patch.id=patchwork_comment.patch_id
+              AND patchwork_patch.msgid=patchwork_comment.msgid
+        ''')
+    else:
+        Comment = apps.get_model('patchwork', 'Comment')
+        Patch = apps.get_model('patchwork', 'Patch')
+
+        for patch in Patch.objects.all():
+            try:
+                # when available, this can only return one entry due to the
+                # unique_together constraint
+                comment = Comment.objects.get(patch=patch, msgid=patch.msgid)
+            except Comment.DoesNotExist:
+                # though there's no requirement to actually have a comment
+                continue
+
+            patch.content = comment.content
+            patch.save()
 
-    for patch in Patch.objects.all():
-        try:
-            # when available, this can only return one entry due to the
-            # unique_together constraint
-            comment = Comment.objects.get(patch=patch, msgid=patch.msgid)
-        except Comment.DoesNotExist:
-            # though there's no requirement to actually have a comment
-            continue
 
-        patch.content = comment.content
-        patch.save()
+def remove_duplicate_comments(apps, schema_editor):
+    if connection.vendor == 'postgresql':
+        schema_editor.execute('''
+            DELETE FROM patchwork_comment
+              USING patchwork_patch
+              WHERE patchwork_patch.id=patchwork_comment.patch_id
+                    AND patchwork_patch.msgid=patchwork_comment.msgid
+        ''')
+    elif connection.vendor == 'mysql':
+        schema_editor.execute('''
+            DELETE FROM patchwork_comment
+              USING patchwork_patch, patchwork_comment
+              WHERE patchwork_patch.id=patchwork_comment.patch_id
+                    AND patchwork_patch.msgid=patchwork_comment.msgid
+        ''')
+    else:
+        Comment = apps.get_model('patchwork', 'Comment')
+        Patch = apps.get_model('patchwork', 'Patch')
+
+        for patch in Patch.objects.all():
+            try:
+                # when available, this can only return one entry due to the
+                # unique_together constraint
+                comment = Comment.objects.get(patch=patch, msgid=patch.msgid)
+                comment.delete()
+            except Comment.DoesNotExist:
+                # though there's no requirement to actually have a comment
+                continue
 
 
 def uncopy_comment_field(apps, schema_editor):
-    Patch = apps.get_model('patchwork', 'Patch')
-
-    for patch in Patch.objects.all():
-        patch.content = None
-        patch.save()
-
-
-def remove_duplicate_comments(apps, schema_editor):
-    Comment = apps.get_model('patchwork', 'Comment')
-    Patch = apps.get_model('patchwork', 'Patch')
-
-    for patch in Patch.objects.all():
-        try:
-            # when available, this can only return one entry due to the
-            # unique_together constraint
-            comment = Comment.objects.get(patch=patch, msgid=patch.msgid)
-            comment.delete()
-        except Comment.DoesNotExist:
-            # though there's no requirement to actually have a comment
-            continue
+    # This is no-op because the column is being deleted
+    pass
 
 
 def recreate_comments(apps, schema_editor):