Ejemplo n.º 1
0
 def test_run_python_atomic(self):
     """
     Tests the RunPython operation correctly handles the "atomic" keyword
     """
     project_state = self.set_up_test_model("test_runpythonatomic", mti_model=True)
     def inner_method(models, schema_editor):
         Pony = models.get_model("test_runpythonatomic", "Pony")
         Pony.objects.create(pink=1, weight=3.55)
         raise ValueError("Adrian hates ponies.")
     atomic_migration = Migration("test", "test_runpythonatomic")
     atomic_migration.operations = [migrations.RunPython(inner_method)]
     non_atomic_migration = Migration("test", "test_runpythonatomic")
     non_atomic_migration.operations = [migrations.RunPython(inner_method, atomic=False)]
     # If we're a fully-transactional database, both versions should rollback
     if connection.features.can_rollback_ddl:
         self.assertEqual(project_state.render().get_model("test_runpythonatomic", "Pony").objects.count(), 0)
         with self.assertRaises(ValueError):
             with connection.schema_editor() as editor:
                 atomic_migration.apply(project_state, editor)
         self.assertEqual(project_state.render().get_model("test_runpythonatomic", "Pony").objects.count(), 0)
         with self.assertRaises(ValueError):
             with connection.schema_editor() as editor:
                 non_atomic_migration.apply(project_state, editor)
         self.assertEqual(project_state.render().get_model("test_runpythonatomic", "Pony").objects.count(), 0)
     # Otherwise, the non-atomic operation should leave a row there
     else:
         self.assertEqual(project_state.render().get_model("test_runpythonatomic", "Pony").objects.count(), 0)
         with self.assertRaises(ValueError):
             with connection.schema_editor() as editor:
                 atomic_migration.apply(project_state, editor)
         self.assertEqual(project_state.render().get_model("test_runpythonatomic", "Pony").objects.count(), 0)
         with self.assertRaises(ValueError):
             with connection.schema_editor() as editor:
                 non_atomic_migration.apply(project_state, editor)
         self.assertEqual(project_state.render().get_model("test_runpythonatomic", "Pony").objects.count(), 1)
Ejemplo n.º 2
0
    def test_run_python_atomic(self):
        """
        Tests the RunPython operation correctly handles the "atomic" keyword
        """
        project_state = self.set_up_test_model("test_runpythonatomic",
                                               mti_model=True)

        def inner_method(models, schema_editor):
            Pony = models.get_model("test_runpythonatomic", "Pony")
            Pony.objects.create(pink=1, weight=3.55)
            raise ValueError("Adrian hates ponies.")

        atomic_migration = Migration("test", "test_runpythonatomic")
        atomic_migration.operations = [migrations.RunPython(inner_method)]
        non_atomic_migration = Migration("test", "test_runpythonatomic")
        non_atomic_migration.operations = [
            migrations.RunPython(inner_method, atomic=False)
        ]
        # If we're a fully-transactional database, both versions should rollback
        if connection.features.can_rollback_ddl:
            self.assertEqual(
                project_state.render().get_model("test_runpythonatomic",
                                                 "Pony").objects.count(), 0)
            with self.assertRaises(ValueError):
                with connection.schema_editor() as editor:
                    atomic_migration.apply(project_state, editor)
            self.assertEqual(
                project_state.render().get_model("test_runpythonatomic",
                                                 "Pony").objects.count(), 0)
            with self.assertRaises(ValueError):
                with connection.schema_editor() as editor:
                    non_atomic_migration.apply(project_state, editor)
            self.assertEqual(
                project_state.render().get_model("test_runpythonatomic",
                                                 "Pony").objects.count(), 0)
        # Otherwise, the non-atomic operation should leave a row there
        else:
            self.assertEqual(
                project_state.render().get_model("test_runpythonatomic",
                                                 "Pony").objects.count(), 0)
            with self.assertRaises(ValueError):
                with connection.schema_editor() as editor:
                    atomic_migration.apply(project_state, editor)
            self.assertEqual(
                project_state.render().get_model("test_runpythonatomic",
                                                 "Pony").objects.count(), 0)
            with self.assertRaises(ValueError):
                with connection.schema_editor() as editor:
                    non_atomic_migration.apply(project_state, editor)
            self.assertEqual(
                project_state.render().get_model("test_runpythonatomic",
                                                 "Pony").objects.count(), 1)
 def apply_operations(self,
                      app_label,
                      project_state,
                      operations,
                      atomic=True):
     migration = Migration("name", app_label)
     migration.operations = operations
     with connection.schema_editor(atomic=atomic) as editor:
         return migration.apply(project_state, editor)
Ejemplo n.º 4
0
 def unapply_operations(self, app_label, project_state, operations):
     migration = Migration('name', app_label)
     migration.operations = operations
     with connection.schema_editor() as editor:
         return migration.unapply(project_state, editor)
Ejemplo n.º 5
0
 def apply_operations(self, app_label, project_state, operations):
     migration = Migration('name', app_label)
     migration.operations = operations
     with connection.schema_editor() as editor:
         return migration.apply(project_state, editor)