Refs #8138 -- Added a stealth option to the loaddata command so that the use of transactions in loaddata can be disabled. This behavior isn't enabled as a commad line option because it doesn't make much sense, but it can be used when invoking loaddata from another script.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@8336 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
cb1368bbc6
commit
4edbb8b2ca
|
@ -28,7 +28,15 @@ class Command(BaseCommand):
|
||||||
|
|
||||||
verbosity = int(options.get('verbosity', 1))
|
verbosity = int(options.get('verbosity', 1))
|
||||||
show_traceback = options.get('traceback', False)
|
show_traceback = options.get('traceback', False)
|
||||||
|
|
||||||
|
# commit is a stealth option - it isn't really useful as
|
||||||
|
# a command line option, but it can be useful when invoking
|
||||||
|
# loaddata from within another script.
|
||||||
|
# If commit=True, loaddata will use its own transaction;
|
||||||
|
# if commit=False, the data load SQL will become part of
|
||||||
|
# the transaction in place when loaddata was invoked.
|
||||||
|
commit = options.get('commit', True)
|
||||||
|
|
||||||
# Keep a count of the installed objects and fixtures
|
# Keep a count of the installed objects and fixtures
|
||||||
fixture_count = 0
|
fixture_count = 0
|
||||||
object_count = 0
|
object_count = 0
|
||||||
|
@ -44,9 +52,10 @@ class Command(BaseCommand):
|
||||||
|
|
||||||
# Start transaction management. All fixtures are installed in a
|
# Start transaction management. All fixtures are installed in a
|
||||||
# single transaction to ensure that all references are resolved.
|
# single transaction to ensure that all references are resolved.
|
||||||
transaction.commit_unless_managed()
|
if commit:
|
||||||
transaction.enter_transaction_management()
|
transaction.commit_unless_managed()
|
||||||
transaction.managed(True)
|
transaction.enter_transaction_management()
|
||||||
|
transaction.managed(True)
|
||||||
|
|
||||||
app_fixtures = [os.path.join(os.path.dirname(app.__file__), 'fixtures') for app in get_apps()]
|
app_fixtures = [os.path.join(os.path.dirname(app.__file__), 'fixtures') for app in get_apps()]
|
||||||
for fixture_label in fixture_labels:
|
for fixture_label in fixture_labels:
|
||||||
|
@ -133,7 +142,7 @@ class Command(BaseCommand):
|
||||||
(format, fixture_name, humanize(fixture_dir))
|
(format, fixture_name, humanize(fixture_dir))
|
||||||
|
|
||||||
|
|
||||||
# If any of the fixtures we loaded contain 0 objects, assume that an
|
# If any of the fixtures we loaded contain 0 objects, assume that an
|
||||||
# error was encountered during fixture loading.
|
# error was encountered during fixture loading.
|
||||||
if 0 in objects_per_fixture:
|
if 0 in objects_per_fixture:
|
||||||
sys.stderr.write(
|
sys.stderr.write(
|
||||||
|
@ -143,7 +152,7 @@ class Command(BaseCommand):
|
||||||
transaction.leave_transaction_management()
|
transaction.leave_transaction_management()
|
||||||
return
|
return
|
||||||
|
|
||||||
# If we found even one object in a fixture, we need to reset the
|
# If we found even one object in a fixture, we need to reset the
|
||||||
# database sequences.
|
# database sequences.
|
||||||
if object_count > 0:
|
if object_count > 0:
|
||||||
sequence_sql = connection.ops.sequence_reset_sql(self.style, models)
|
sequence_sql = connection.ops.sequence_reset_sql(self.style, models)
|
||||||
|
@ -152,9 +161,10 @@ class Command(BaseCommand):
|
||||||
print "Resetting sequences"
|
print "Resetting sequences"
|
||||||
for line in sequence_sql:
|
for line in sequence_sql:
|
||||||
cursor.execute(line)
|
cursor.execute(line)
|
||||||
|
|
||||||
transaction.commit()
|
if commit:
|
||||||
transaction.leave_transaction_management()
|
transaction.commit()
|
||||||
|
transaction.leave_transaction_management()
|
||||||
|
|
||||||
if object_count == 0:
|
if object_count == 0:
|
||||||
if verbosity > 1:
|
if verbosity > 1:
|
||||||
|
@ -167,4 +177,5 @@ class Command(BaseCommand):
|
||||||
# edge case in MySQL: if the same connection is used to
|
# edge case in MySQL: if the same connection is used to
|
||||||
# create tables, load data, and query, the query can return
|
# create tables, load data, and query, the query can return
|
||||||
# incorrect results. See Django #7572, MySQL #37735.
|
# incorrect results. See Django #7572, MySQL #37735.
|
||||||
connection.close()
|
if commit:
|
||||||
|
connection.close()
|
||||||
|
|
Loading…
Reference in New Issue