Fixed #23303 -- Added BEGIN and COMMIT statements to the output of sqlmigrate.

This commit is contained in:
Baptiste Mispelon 2014-08-16 17:21:14 +02:00
parent b6aa60f425
commit 5853c87a45
7 changed files with 38 additions and 2 deletions

View File

@ -10,6 +10,8 @@ from django.db.migrations.loader import AmbiguityError
class Command(BaseCommand):
help = "Prints the SQL statements for the named migration."
output_transaction = True
def add_arguments(self, parser):
parser.add_argument('app_label',
help='App label of the application containing the migration.')
@ -21,6 +23,13 @@ class Command(BaseCommand):
parser.add_argument('--backwards', action='store_true', dest='backwards',
default=False, help='Creates SQL to unapply the migration, rather than to apply it')
def execute(self, *args, **options):
# sqlmigrate doesn't support coloring its output but we need to force
# no_color=True so that the BEGIN/COMMIT statements added by
# output_transaction don't get colored either.
options['no_color'] = True
return super(Command, self).execute(*args, **options)
def handle(self, *args, **options):
# Get the database we're operating from
connection = connections[options['database']]
@ -46,5 +55,4 @@ class Command(BaseCommand):
# for it
plan = [(executor.loader.graph.nodes[targets[0]], options['backwards'])]
sql_statements = executor.collect_sql(plan)
for statement in sql_statements:
self.stdout.write(statement)
return '\n'.join(sql_statements)

View File

@ -480,6 +480,7 @@ readability):
.. code-block:: sql
BEGIN;
CREATE TABLE polls_question (
"id" serial NOT NULL PRIMARY KEY,
"question_text" varchar(200) NOT NULL,
@ -500,6 +501,7 @@ readability):
FOREIGN KEY ("question_id")
REFERENCES "polls_question" ("id")
DEFERRABLE INITIALLY DEFERRED;
COMMIT;
Note the following:

View File

@ -285,6 +285,7 @@ This command should produce the following output:
.. code-block:: sql
BEGIN;
CREATE TABLE "world_worldborder" (
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(50) NOT NULL,
@ -302,6 +303,7 @@ This command should produce the following output:
)
;
CREATE INDEX "world_worldborder_mpoly_id" ON "world_worldborder" USING GIST ( "mpoly" );
COMMIT;
.. note::

View File

@ -1136,6 +1136,8 @@ Prints the SQL for the named migration. This requires an active database
connection, which it will use to resolve constraint names; this means you must
generate the SQL against a copy of the database you wish to later apply it on.
Note that ``sqlmigrate`` doesn't colorize its output.
The :djadminopt:`--database` option can be used to specify the database for
which to generate the SQL.

View File

@ -93,6 +93,13 @@ class MigrateTests(MigrationTestBase):
"""
Makes sure that sqlmigrate does something.
"""
# Make sure the output is wrapped in a transaction
stdout = six.StringIO()
call_command("sqlmigrate", "migrations", "0001", stdout=stdout)
output = stdout.getvalue().lower()
self.assertIn("begin;", output)
self.assertIn("commit;", output)
# Test forwards. All the databases agree on CREATE TABLE, at least.
stdout = six.StringIO()
call_command("sqlmigrate", "migrations", "0001", stdout=stdout)

View File

@ -0,0 +1,10 @@
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = "Say hello."
args = ''
output_transaction = True
def handle(self, *args, **options):
return 'Hello!'

View File

@ -134,6 +134,11 @@ class CommandTests(SimpleTestCase):
with self.assertRaises(CommandError):
management.call_command('hal', stdout=out)
def test_output_transaction(self):
out = StringIO()
management.call_command('transaction', stdout=out, no_color=True)
self.assertEqual(out.getvalue(), 'BEGIN;\nHello!\n\nCOMMIT;\n')
class UtilsTests(SimpleTestCase):