Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge pull request #2120 from ramiro/schema-creation-quoting

Fixed #21692 -- Quote table name when creating it.
  • Loading branch information...
commit 61cfcec5b7d47232a1d6facbde71d4cca35986eb 2 parents 14bcbd9 + 3efd1b8
@ramiro ramiro authored
View
2  django/db/backends/schema.py
@@ -227,7 +227,7 @@ def create_model(self, model):
})
# 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)
View
13 tests/schema/models.py
@@ -1,5 +1,6 @@
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
@@ -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
View
28 tests/schema/tests.py
@@ -3,13 +3,13 @@
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):
@@ -26,6 +26,7 @@ class SchemaTests(TransactionTestCase):
models = [
Author, AuthorWithM2M, Book, BookWithLongName, BookWithSlug,
BookWithM2M, Tag, TagIndexed, TagM2MTest, TagUniqueRename, UniqueTest,
+ Thing
]
# Utility functions
@@ -683,3 +684,26 @@ def test_foreign_key_index_long_names_regression(self):
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()),
+ )

0 comments on commit 61cfcec

Please sign in to comment.
Something went wrong with that request. Please try again.