diff --git a/django/core/management/commands/loaddata.py b/django/core/management/commands/loaddata.py index 7467f983e8..d073fea812 100644 --- a/django/core/management/commands/loaddata.py +++ b/django/core/management/commands/loaddata.py @@ -35,7 +35,6 @@ class Command(BaseCommand): # Keep a count of the installed objects and fixtures fixture_count = 0 object_count = 0 - objects_per_fixture = [] models = set() humanize = lambda dirname: dirname and "'%s'" % dirname or 'absolute path' @@ -103,17 +102,17 @@ class Command(BaseCommand): return else: fixture_count += 1 - objects_per_fixture.append(0) + objects_in_fixture = 0 if verbosity > 0: print "Installing %s fixture '%s' from %s." % \ (format, fixture_name, humanize(fixture_dir)) try: objects = serializers.deserialize(format, fixture) for obj in objects: - object_count += 1 - objects_per_fixture[-1] += 1 + objects_in_fixture += 1 models.add(obj.object.__class__) obj.save() + object_count += objects_in_fixture label_found = True except (SystemExit, KeyboardInterrupt): raise @@ -131,22 +130,21 @@ class Command(BaseCommand): (full_path, traceback.format_exc()))) return fixture.close() + + # If the fixture we loaded contains 0 objects, assume that an + # error was encountered during fixture loading. + if objects_in_fixture == 0: + sys.stderr.write( + self.style.ERROR("No fixture data found for '%s'. (File format may be invalid.)" % + (fixture_name))) + transaction.rollback() + transaction.leave_transaction_management() + return except: if verbosity > 1: print "No %s fixture '%s' in %s." % \ (format, fixture_name, humanize(fixture_dir)) - - # If any of the fixtures we loaded contain 0 objects, assume that an - # error was encountered during fixture loading. - if 0 in objects_per_fixture: - sys.stderr.write( - self.style.ERROR("No fixture data found for '%s'. (File format may be invalid.)" % - (fixture_name))) - transaction.rollback() - transaction.leave_transaction_management() - return - # If we found even one object in a fixture, we need to reset the # database sequences. if object_count > 0: diff --git a/tests/regressiontests/fixtures_regress/models.py b/tests/regressiontests/fixtures_regress/models.py index 9bca78bc59..373980bb66 100644 --- a/tests/regressiontests/fixtures_regress/models.py +++ b/tests/regressiontests/fixtures_regress/models.py @@ -7,7 +7,7 @@ class Animal(models.Model): name = models.CharField(max_length=150) latin_name = models.CharField(max_length=150) count = models.IntegerField() - + def __unicode__(self): return self.common_name @@ -56,7 +56,7 @@ class Channel(models.Model): class Article(models.Model): title = models.CharField(max_length=255) channels = models.ManyToManyField(Channel) - + class Meta: ordering = ('id',) @@ -113,6 +113,15 @@ No fixture data found for 'bad_fixture2'. (File format may be invalid.) >>> management.call_command('loaddata', 'bad_fixture2', verbosity=0) No fixture data found for 'bad_fixture2'. (File format may be invalid.) +# Loading a fixture file with no data returns an error +>>> management.call_command('loaddata', 'empty', verbosity=0) +No fixture data found for 'empty'. (File format may be invalid.) + +# If any of the fixtures contain an error, loading is aborted +# (Regression for #9011 - error message is correct) +>>> management.call_command('loaddata', 'bad_fixture2', 'animal', verbosity=0) +No fixture data found for 'bad_fixture2'. (File format may be invalid.) + >>> sys.stderr = savestderr ############################################### @@ -123,7 +132,7 @@ No fixture data found for 'bad_fixture2'. (File format may be invalid.) >>> management.call_command('loaddata', 'model-inheritance.json', verbosity=0) ############################################### -# Test for ticket #7572 -- MySQL has a problem if the same connection is +# Test for ticket #7572 -- MySQL has a problem if the same connection is # used to create tables, load data, and then query over that data. # To compensate, we close the connection after running loaddata. # This ensures that a new connection is opened when test queries are issued.