#25180: ArrayFields should not have varchar_patterns_ops or text_patterns_ops
indexes
----------------------------------+-----------------
     Reporter:  fabianbuechler    |      Owner:
         Type:  Bug               |     Status:  new
    Component:  contrib.postgres  |    Version:  1.8
     Severity:  Normal            |   Keywords:
 Triage Stage:  Unreviewed        |  Has patch:  0
Easy pickings:  0                 |      UI/UX:  0
----------------------------------+-----------------
 I believe I bumped into a bug using the new PostgreSQL `ArrayField` from
 1.8 in combination with `db_index=True`:


 This seems to be related to Django ticket #12234 which introduced creating
 secondary
 `varchar_patterns_ops` or `text_patterns_ops` indexes for varchar or text
 fields
 respectively, so that PostgreSQL could use them for the `contains` filter
 (e.g. `MyModel.object.filter(name__contains='abc')`).

 However, for the array fields introduced with Django 1.8 this does not
 seem to
 work when having `db_index` activated. When `syncdb` or `migrate` try to
 create the secondary index, PostgreSQL raises an error like this:

 {{{#!python
 django.db.utils.ProgrammingError: operator class "varchar_pattern_ops"
 does not accept data type character varying[]
 }}}

 The executed SQL statement is something like this:

 {{{#!sql
 CREATE INDEX "shop_product_package_product_numbers_2ebd72fe1541fbd4_like"
 ON "shop_product" ("package_product_numbers" varchar_pattern_ops)
 }}}

 The important parts of the model defintion are:

 {{{#!python
 class Product(models.Model):

     package_product_numbers = ArrayField(
         models.CharField(max_length=10, blank=True),
         verbose_name="Package product numbers",
         null=True, default=None, db_index=True)
 }}}

 I'm currently using a workaroud to fix this. I created a custom DB backend
 that inherits from the postgresql_psycopg2 one and overwrites the
 `DatabaseCreation.sql_indexes_for_field` and
 `DatabaseSchemaEditor._model_indexes_sql` methods to check for ArrayFields
 when creating those secondary indexes. I can post this code here, if you
 need it, however, I don't think that this is the right solution, since the
 PostgreSQL database backend should not really need to know anything about
 the `django.contrib.postgresql` stuff.

 Please let me know if I can help to reproduce this.

--
Ticket URL: <https://code.djangoproject.com/ticket/25180>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/057.166717ac0d923ce5f33535e4bf275297%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to