Loading django/db/backends/schema.py +1 −1 Original line number Diff line number Diff line Loading @@ -227,7 +227,7 @@ class BaseDatabaseSchemaEditor(object): }) # Make the table sql = self.sql_create_table % { "table": model._meta.db_table, "table": self.quote_name(model._meta.db_table), "definition": ", ".join(column_sqls) } self.execute(sql, params) Loading tests/schema/models.py +13 −0 Original line number Diff line number Diff line from django.apps.registry import Apps from django.db import models from django.utils.encoding import python_2_unicode_compatible # Because we want to test creation and deletion of these as separate things, # these models are all inserted into a separate Apps so the main test Loading Loading @@ -102,3 +103,15 @@ class BookWithLongName(models.Model): class Meta: apps = new_apps # Based on tests/reserved_names/models.py @python_2_unicode_compatible class Thing(models.Model): when = models.CharField(max_length=1, primary_key=True) class Meta: db_table = 'select' def __str__(self): return self.when tests/schema/tests.py +26 −2 Original line number Diff line number Diff line Loading @@ -3,13 +3,13 @@ import datetime import unittest from django.test import TransactionTestCase from django.db import connection, DatabaseError, IntegrityError from django.db import connection, DatabaseError, IntegrityError, OperationalError from django.db.models.fields import IntegerField, TextField, CharField, SlugField from django.db.models.fields.related import ManyToManyField, ForeignKey from django.db.transaction import atomic from .models import (Author, AuthorWithM2M, Book, BookWithLongName, BookWithSlug, BookWithM2M, Tag, TagIndexed, TagM2MTest, TagUniqueRename, UniqueTest) UniqueTest, Thing) class SchemaTests(TransactionTestCase): Loading @@ -26,6 +26,7 @@ class SchemaTests(TransactionTestCase): models = [ Author, AuthorWithM2M, Book, BookWithLongName, BookWithSlug, BookWithM2M, Tag, TagIndexed, TagM2MTest, TagUniqueRename, UniqueTest, Thing ] # Utility functions Loading Loading @@ -683,3 +684,26 @@ class SchemaTests(TransactionTestCase): column_name, connection.introspection.get_indexes(connection.cursor(), BookWithLongName._meta.db_table), ) def test_creation_deletion_reserved_names(self): """ Tries creating a model's table, and then deleting it when it has a SQL reserved name. """ # Create the table with connection.schema_editor() as editor: try: editor.create_model(Thing) except OperationalError as e: self.fail("Errors when applying initial migration for a model " "with a table named after a SQL reserved word: %s" % e) # Check that it's there list(Thing.objects.all()) # Clean up that table with connection.schema_editor() as editor: editor.delete_model(Thing) # Check that it's gone self.assertRaises( DatabaseError, lambda: list(Thing.objects.all()), ) Loading
django/db/backends/schema.py +1 −1 Original line number Diff line number Diff line Loading @@ -227,7 +227,7 @@ class BaseDatabaseSchemaEditor(object): }) # Make the table sql = self.sql_create_table % { "table": model._meta.db_table, "table": self.quote_name(model._meta.db_table), "definition": ", ".join(column_sqls) } self.execute(sql, params) Loading
tests/schema/models.py +13 −0 Original line number Diff line number Diff line from django.apps.registry import Apps from django.db import models from django.utils.encoding import python_2_unicode_compatible # Because we want to test creation and deletion of these as separate things, # these models are all inserted into a separate Apps so the main test Loading Loading @@ -102,3 +103,15 @@ class BookWithLongName(models.Model): class Meta: apps = new_apps # Based on tests/reserved_names/models.py @python_2_unicode_compatible class Thing(models.Model): when = models.CharField(max_length=1, primary_key=True) class Meta: db_table = 'select' def __str__(self): return self.when
tests/schema/tests.py +26 −2 Original line number Diff line number Diff line Loading @@ -3,13 +3,13 @@ import datetime import unittest from django.test import TransactionTestCase from django.db import connection, DatabaseError, IntegrityError from django.db import connection, DatabaseError, IntegrityError, OperationalError from django.db.models.fields import IntegerField, TextField, CharField, SlugField from django.db.models.fields.related import ManyToManyField, ForeignKey from django.db.transaction import atomic from .models import (Author, AuthorWithM2M, Book, BookWithLongName, BookWithSlug, BookWithM2M, Tag, TagIndexed, TagM2MTest, TagUniqueRename, UniqueTest) UniqueTest, Thing) class SchemaTests(TransactionTestCase): Loading @@ -26,6 +26,7 @@ class SchemaTests(TransactionTestCase): models = [ Author, AuthorWithM2M, Book, BookWithLongName, BookWithSlug, BookWithM2M, Tag, TagIndexed, TagM2MTest, TagUniqueRename, UniqueTest, Thing ] # Utility functions Loading Loading @@ -683,3 +684,26 @@ class SchemaTests(TransactionTestCase): column_name, connection.introspection.get_indexes(connection.cursor(), BookWithLongName._meta.db_table), ) def test_creation_deletion_reserved_names(self): """ Tries creating a model's table, and then deleting it when it has a SQL reserved name. """ # Create the table with connection.schema_editor() as editor: try: editor.create_model(Thing) except OperationalError as e: self.fail("Errors when applying initial migration for a model " "with a table named after a SQL reserved word: %s" % e) # Check that it's there list(Thing.objects.all()) # Clean up that table with connection.schema_editor() as editor: editor.delete_model(Thing) # Check that it's gone self.assertRaises( DatabaseError, lambda: list(Thing.objects.all()), )