瀏覽代碼

Fixed #26889 -- Fixed missing PostgreSQL index in SchemaEditor.add_field().

Jon Dufresne 8 年之前
父節點
當前提交
2e4cfcd2b9
共有 5 個文件被更改,包括 50 次插入1 次删除
  1. 6 0
      django/db/backends/postgresql/schema.py
  2. 14 0
      docs/releases/1.8.14.txt
  3. 3 1
      docs/releases/1.9.8.txt
  4. 1 0
      docs/releases/index.txt
  5. 26 0
      tests/schema/tests.py

+ 6 - 0
django/db/backends/postgresql/schema.py

@@ -17,6 +17,12 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
     def quote_value(self, value):
         return psycopg2.extensions.adapt(value)
 
+    def add_field(self, model, field):
+        super(DatabaseSchemaEditor, self).add_field(model, field)
+        like_index_statement = self._create_like_index_sql(model, field)
+        if like_index_statement is not None:
+            self.deferred_sql.append(like_index_statement)
+
     def _model_indexes_sql(self, model):
         output = super(DatabaseSchemaEditor, self)._model_indexes_sql(model)
         if not model._meta.managed or model._meta.proxy or model._meta.swapped:

+ 14 - 0
docs/releases/1.8.14.txt

@@ -0,0 +1,14 @@
+===========================
+Django 1.8.14 release notes
+===========================
+
+*Under development*
+
+Django 1.8.14 fixes several bugs in 1.8.13.
+
+Bugfixes
+========
+
+* Fixed missing ``varchar/text_pattern_ops`` index on ``CharField`` and
+  ``TextField`` respectively when using ``AddField`` on PostgreSQL
+  (:ticket:`26889`).

+ 3 - 1
docs/releases/1.9.8.txt

@@ -9,4 +9,6 @@ Django 1.9.8 fixes several bugs in 1.9.7.
 Bugfixes
 ========
 
-* ...
+* Fixed missing ``varchar/text_pattern_ops`` index on ``CharField`` and
+  ``TextField`` respectively when using ``AddField`` on PostgreSQL
+  (:ticket:`26889`).

+ 1 - 0
docs/releases/index.txt

@@ -55,6 +55,7 @@ versions of the documentation contain the release notes for any later releases.
 .. toctree::
    :maxdepth: 1
 
+   1.8.14
    1.8.13
    1.8.12
    1.8.11

+ 26 - 0
tests/schema/tests.py

@@ -1907,6 +1907,32 @@ class SchemaTests(TransactionTestCase):
         with connection.schema_editor() as editor:
             editor.add_field(Author, new_field)
 
+    @unittest.skipUnless(connection.vendor == 'postgresql', "PostgreSQL specific")
+    def test_add_indexed_charfield(self):
+        field = CharField(max_length=255, db_index=True)
+        field.set_attributes_from_name('nom_de_plume')
+        with connection.schema_editor() as editor:
+            editor.create_model(Author)
+            editor.add_field(Author, field)
+        # Should create two indexes; one for like operator.
+        self.assertEqual(
+            self.get_constraints_for_column(Author, 'nom_de_plume'),
+            ['schema_author_95aa9e9b', 'schema_author_nom_de_plume_7570a851_like'],
+        )
+
+    @unittest.skipUnless(connection.vendor == 'postgresql', "PostgreSQL specific")
+    def test_add_unique_charfield(self):
+        field = CharField(max_length=255, unique=True)
+        field.set_attributes_from_name('nom_de_plume')
+        with connection.schema_editor() as editor:
+            editor.create_model(Author)
+            editor.add_field(Author, field)
+        # Should create two indexes; one for like operator.
+        self.assertEqual(
+            self.get_constraints_for_column(Author, 'nom_de_plume'),
+            ['schema_author_nom_de_plume_7570a851_like', 'schema_author_nom_de_plume_key']
+        )
+
     @unittest.skipUnless(connection.vendor == 'postgresql', "PostgreSQL specific")
     def test_alter_field_add_index_to_charfield(self):
         # Create the table and verify no initial indexes.