Fixed #21692 -- Quote table name when creating it.

This commit is contained in:
Ramiro Morales 2013-12-22 16:44:49 -03:00
parent efddae252c
commit 3efd1b8b93
3 changed files with 40 additions and 3 deletions

View File

@ -227,7 +227,7 @@ class BaseDatabaseSchemaEditor(object):
}) })
# Make the table # Make the table
sql = self.sql_create_table % { sql = self.sql_create_table % {
"table": model._meta.db_table, "table": self.quote_name(model._meta.db_table),
"definition": ", ".join(column_sqls) "definition": ", ".join(column_sqls)
} }
self.execute(sql, params) self.execute(sql, params)

View File

@ -1,5 +1,6 @@
from django.apps.registry import Apps from django.apps.registry import Apps
from django.db import models 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, # 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 # these models are all inserted into a separate Apps so the main test
@ -102,3 +103,15 @@ class BookWithLongName(models.Model):
class Meta: class Meta:
apps = new_apps 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 File

@ -3,13 +3,13 @@ import datetime
import unittest import unittest
from django.test import TransactionTestCase 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 import IntegerField, TextField, CharField, SlugField
from django.db.models.fields.related import ManyToManyField, ForeignKey from django.db.models.fields.related import ManyToManyField, ForeignKey
from django.db.transaction import atomic from django.db.transaction import atomic
from .models import (Author, AuthorWithM2M, Book, BookWithLongName, from .models import (Author, AuthorWithM2M, Book, BookWithLongName,
BookWithSlug, BookWithM2M, Tag, TagIndexed, TagM2MTest, TagUniqueRename, BookWithSlug, BookWithM2M, Tag, TagIndexed, TagM2MTest, TagUniqueRename,
UniqueTest) UniqueTest, Thing)
class SchemaTests(TransactionTestCase): class SchemaTests(TransactionTestCase):
@ -26,6 +26,7 @@ class SchemaTests(TransactionTestCase):
models = [ models = [
Author, AuthorWithM2M, Book, BookWithLongName, BookWithSlug, Author, AuthorWithM2M, Book, BookWithLongName, BookWithSlug,
BookWithM2M, Tag, TagIndexed, TagM2MTest, TagUniqueRename, UniqueTest, BookWithM2M, Tag, TagIndexed, TagM2MTest, TagUniqueRename, UniqueTest,
Thing
] ]
# Utility functions # Utility functions
@ -683,3 +684,26 @@ class SchemaTests(TransactionTestCase):
column_name, column_name,
connection.introspection.get_indexes(connection.cursor(), BookWithLongName._meta.db_table), 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()),
)