[1.8.x] Fixed #24892 -- Fixed quoting of SQL when renaming a field to AutoField in PostgreSQL

Backport of 5ab8680983 from master
This commit is contained in:
Tim Graham 2015-06-01 17:06:54 -04:00
parent 3b41850adc
commit 8911d2e20f
4 changed files with 41 additions and 14 deletions

View File

@ -52,31 +52,31 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
[ [
( (
self.sql_delete_sequence % { self.sql_delete_sequence % {
"sequence": sequence_name, "sequence": self.quote_name(sequence_name),
}, },
[], [],
), ),
( (
self.sql_create_sequence % { self.sql_create_sequence % {
"sequence": sequence_name, "sequence": self.quote_name(sequence_name),
}, },
[], [],
), ),
( (
self.sql_alter_column % { self.sql_alter_column % {
"table": table, "table": self.quote_name(table),
"changes": self.sql_alter_column_default % { "changes": self.sql_alter_column_default % {
"column": column, "column": self.quote_name(column),
"default": "nextval('%s')" % sequence_name, "default": "nextval('%s')" % self.quote_name(sequence_name),
} }
}, },
[], [],
), ),
( (
self.sql_set_sequence_max % { self.sql_set_sequence_max % {
"table": table, "table": self.quote_name(table),
"column": column, "column": self.quote_name(column),
"sequence": sequence_name, "sequence": self.quote_name(sequence_name),
}, },
[], [],
), ),

View File

@ -31,3 +31,6 @@ Bugfixes
* Fixed a crash when using a reverse one-to-one relation in * Fixed a crash when using a reverse one-to-one relation in
``ModelAdmin.list_display`` (:ticket:`24851`). ``ModelAdmin.list_display`` (:ticket:`24851`).
* Fixed quoting of SQL when renaming a field to ``AutoField`` in PostgreSQL
(:ticket:`24892`).

View File

@ -80,6 +80,14 @@ class BookWithSlug(models.Model):
db_table = "schema_book" db_table = "schema_book"
class IntegerPK(models.Model):
i = models.IntegerField(primary_key=True)
class Meta:
apps = new_apps
db_table = "INTEGERPK" # uppercase to ensure proper quoting
class Note(models.Model): class Note(models.Model):
info = models.TextField() info = models.TextField()

View File

@ -8,8 +8,8 @@ from django.db import (
) )
from django.db.models import Model from django.db.models import Model
from django.db.models.fields import ( from django.db.models.fields import (
BigIntegerField, BinaryField, BooleanField, CharField, DateTimeField, AutoField, BigIntegerField, BinaryField, BooleanField, CharField,
IntegerField, PositiveIntegerField, SlugField, TextField, DateTimeField, IntegerField, PositiveIntegerField, SlugField, TextField,
) )
from django.db.models.fields.related import ( from django.db.models.fields.related import (
ForeignKey, ManyToManyField, OneToOneField, ForeignKey, ManyToManyField, OneToOneField,
@ -20,8 +20,8 @@ from django.test import TransactionTestCase, skipIfDBFeature
from .fields import CustomManyToManyField, InheritedManyToManyField from .fields import CustomManyToManyField, InheritedManyToManyField
from .models import ( from .models import (
Author, AuthorWithDefaultHeight, AuthorWithEvenLongerName, Book, BookWeak, Author, AuthorWithDefaultHeight, AuthorWithEvenLongerName, Book, BookWeak,
BookWithLongName, BookWithO2O, BookWithSlug, Note, NoteRename, Tag, BookWithLongName, BookWithO2O, BookWithSlug, IntegerPK, Note, NoteRename,
TagIndexed, TagM2MTest, TagUniqueRename, Thing, UniqueTest, new_apps, Tag, TagIndexed, TagM2MTest, TagUniqueRename, Thing, UniqueTest, new_apps,
) )
@ -38,8 +38,8 @@ class SchemaTests(TransactionTestCase):
models = [ models = [
Author, AuthorWithDefaultHeight, AuthorWithEvenLongerName, Book, Author, AuthorWithDefaultHeight, AuthorWithEvenLongerName, Book,
BookWeak, BookWithLongName, BookWithO2O, BookWithSlug, Note, Tag, BookWeak, BookWithLongName, BookWithO2O, BookWithSlug, IntegerPK, Note,
TagIndexed, TagM2MTest, TagUniqueRename, Thing, UniqueTest, Tag, TagIndexed, TagM2MTest, TagUniqueRename, Thing, UniqueTest,
] ]
# Utility functions # Utility functions
@ -729,6 +729,22 @@ class SchemaTests(TransactionTestCase):
# field which drops the id sequence, at least on PostgreSQL. # field which drops the id sequence, at least on PostgreSQL.
Author.objects.create(name='Foo') Author.objects.create(name='Foo')
def test_alter_int_pk_to_autofield_pk(self):
"""
Should be able to rename an IntegerField(primary_key=True) to
AutoField(primary_key=True).
"""
with connection.schema_editor() as editor:
editor.create_model(IntegerPK)
old_field = IntegerPK._meta.get_field('i')
new_field = AutoField(primary_key=True)
new_field.model = IntegerPK
new_field.set_attributes_from_name('i')
with connection.schema_editor() as editor:
editor.alter_field(IntegerPK, old_field, new_field, strict=True)
def test_rename(self): def test_rename(self):
""" """
Tests simple altering of fields Tests simple altering of fields