Merge pull request #2120 from ramiro/schema-creation-quoting
Fixed #21692 -- Quote table name when creating it.
This commit is contained in:
commit
61cfcec5b7
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()),
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue