class MyModel(models.Model):
geometry = gis_models.GeometryField(
help_text="The area of interest.",
spatial_index=True,
srid=4326,
)
class Meta:
db_table = 'source"."mymodel'
}}}
When you go to run migrations, this error occurs:
{{{
self = <django.db.backends.utils.CursorWrapper object at 0x7f3001dcadc0>
sql = 'CREATE INDEX "source"."mymodel_geometry_id" ON "source"."mymodel"
USING GIST ("geometry")'
params = ()
ignored_wrapper_args = (False, {'connection':
<django.contrib.gis.db.backends.postgis.base.DatabaseWrapper object at
0x7f3002ab6790>, 'cursor': <django.db.backends.utils.CursorWrapper object
at 0x7f3001dcadc0>})
def _execute(self, sql, params, *ignored_wrapper_args):
self.db.validate_no_broken_transaction()
with self.db.wrap_database_errors:
if params is None:
# params default might be backend specific.
return self.cursor.execute(sql)
else:
> return self.cursor.execute(sql, params)
E psycopg2.errors.SyntaxError: syntax error at or near "."
E LINE 1: CREATE INDEX "source"."mymodel_geometry_id" ON
"sour...
E ^
}}}
Currently, the code that generates the name is here:
https://github.com/django/django/blob/65a9d0013d202447dd76a9cb3c939aa5c9d23da3/django/contrib/gis/db/backends/postgis/schema.py#L35-L38
{{{
if kwargs.get('name') is None:
index_name = '%s_%s_id' % (model._meta.db_table, field.column)
else:
index_name = kwargs['name']
}}}
This produces the index name (as seen in the error above):
source"."mymodel_geometry_id
We have been patching this internally with this code instead:
{{{
name = kwargs.get("name")
if name is None:
name = self._create_index_name(
table, [field.column], kwargs.get("suffix", "")
)
}}}
This makes the name something like:
mymodel_geometry_26ff3048
Is this a patch you would like to see? Or do you have a different
recommended solution?
--
Ticket URL: <https://code.djangoproject.com/ticket/32721>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
Old description:
New description:
}}}
model._meta.db_table, [field.column], kwargs.get("suffix",
"")
)
}}}
This makes the name something like:
mymodel_geometry_26ff3048
Is this a patch you would like to see? Or do you have a different
recommended solution?
--
--
Ticket URL: <https://code.djangoproject.com/ticket/32721#comment:1>
* stage: Unreviewed => Accepted
Comment:
Thanks it looks valid, we should use the `_create_index_name()` hook
instead, e.g. `self._create_index_name(model._meta.db_table,
[field.column], suffix='_id')`. Would you like to prepare a patch? (tests
are required).
--
Ticket URL: <https://code.djangoproject.com/ticket/32721#comment:2>
* owner: nobody => Alan D. Snow
* status: new => assigned
* has_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/32721#comment:3>
Comment (by Alan D. Snow):
Happy to submit a patch. Ref: https://github.com/django/django/pull/14364
--
Ticket URL: <https://code.djangoproject.com/ticket/32721#comment:4>
* needs_better_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/32721#comment:5>
* needs_better_patch: 1 => 0
* stage: Accepted => Ready for checkin
--
Ticket URL: <https://code.djangoproject.com/ticket/32721#comment:6>
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"29345aecf6e8d53ccb3577a3762bb0c263f7558d" 29345aec]:
{{{
#!CommitTicketReference repository=""
revision="29345aecf6e8d53ccb3577a3762bb0c263f7558d"
Fixed #32721 -- Fixed migrations crash when adding namespaced spatial
indexes on PostGIS.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/32721#comment:8>
Comment (by Mariusz Felisiak <felisiak.mariusz@…>):
In [changeset:"99bc67a9e79256d8a2fcd5742e33a5e79c056539" 99bc67a]:
{{{
#!CommitTicketReference repository=""
revision="99bc67a9e79256d8a2fcd5742e33a5e79c056539"
Refs #32721 -- Made PostGISSchemaEditor._create_index_sql() call
super()._create_index_sql().
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/32721#comment:7>
Comment (by Tim Graham):
The first commit here makes the GIST_GEOMETRY_OPS_ND opclass disappear
from the creation of PostGIS's 3D geometry indexes (#33294).
--
Ticket URL: <https://code.djangoproject.com/ticket/32721#comment:9>