mirror of
https://github.com/django/django.git
synced 2025-06-05 11:39:13 +00:00
Refs #30123 -- Changed second arg of DatabaseIntrospection.get_geometry_type() to the row description.
This commit is contained in:
parent
2de7eb6f4d
commit
327bbaae24
@ -10,7 +10,7 @@ class MySQLIntrospection(DatabaseIntrospection):
|
|||||||
data_types_reverse = DatabaseIntrospection.data_types_reverse.copy()
|
data_types_reverse = DatabaseIntrospection.data_types_reverse.copy()
|
||||||
data_types_reverse[FIELD_TYPE.GEOMETRY] = 'GeometryField'
|
data_types_reverse[FIELD_TYPE.GEOMETRY] = 'GeometryField'
|
||||||
|
|
||||||
def get_geometry_type(self, table_name, geo_col):
|
def get_geometry_type(self, table_name, description):
|
||||||
with self.connection.cursor() as cursor:
|
with self.connection.cursor() as cursor:
|
||||||
# In order to get the specific geometry type of the field,
|
# In order to get the specific geometry type of the field,
|
||||||
# we introspect on the table definition using `DESCRIBE`.
|
# we introspect on the table definition using `DESCRIBE`.
|
||||||
@ -19,7 +19,7 @@ class MySQLIntrospection(DatabaseIntrospection):
|
|||||||
# Increment over description info until we get to the geometry
|
# Increment over description info until we get to the geometry
|
||||||
# column.
|
# column.
|
||||||
for column, typ, null, key, default, extra in cursor.fetchall():
|
for column, typ, null, key, default, extra in cursor.fetchall():
|
||||||
if column == geo_col:
|
if column == description.name:
|
||||||
# Using OGRGeomType to convert from OGC name to Django field.
|
# Using OGRGeomType to convert from OGC name to Django field.
|
||||||
# MySQL does not support 3D or SRIDs, so the field params
|
# MySQL does not support 3D or SRIDs, so the field params
|
||||||
# are empty.
|
# are empty.
|
||||||
|
@ -10,20 +10,20 @@ class OracleIntrospection(DatabaseIntrospection):
|
|||||||
data_types_reverse = DatabaseIntrospection.data_types_reverse.copy()
|
data_types_reverse = DatabaseIntrospection.data_types_reverse.copy()
|
||||||
data_types_reverse[cx_Oracle.OBJECT] = 'GeometryField'
|
data_types_reverse[cx_Oracle.OBJECT] = 'GeometryField'
|
||||||
|
|
||||||
def get_geometry_type(self, table_name, geo_col):
|
def get_geometry_type(self, table_name, description):
|
||||||
with self.connection.cursor() as cursor:
|
with self.connection.cursor() as cursor:
|
||||||
# Querying USER_SDO_GEOM_METADATA to get the SRID and dimension information.
|
# Querying USER_SDO_GEOM_METADATA to get the SRID and dimension information.
|
||||||
try:
|
try:
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
'SELECT "DIMINFO", "SRID" FROM "USER_SDO_GEOM_METADATA" '
|
'SELECT "DIMINFO", "SRID" FROM "USER_SDO_GEOM_METADATA" '
|
||||||
'WHERE "TABLE_NAME"=%s AND "COLUMN_NAME"=%s',
|
'WHERE "TABLE_NAME"=%s AND "COLUMN_NAME"=%s',
|
||||||
(table_name.upper(), geo_col.upper())
|
(table_name.upper(), description.name.upper())
|
||||||
)
|
)
|
||||||
row = cursor.fetchone()
|
row = cursor.fetchone()
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
raise Exception(
|
raise Exception(
|
||||||
'Could not find entry in USER_SDO_GEOM_METADATA '
|
'Could not find entry in USER_SDO_GEOM_METADATA '
|
||||||
'corresponding to "%s"."%s"' % (table_name, geo_col)
|
'corresponding to "%s"."%s"' % (table_name, description.name)
|
||||||
) from exc
|
) from exc
|
||||||
|
|
||||||
# TODO: Research way to find a more specific geometry field type for
|
# TODO: Research way to find a more specific geometry field type for
|
||||||
|
@ -53,7 +53,7 @@ class PostGISIntrospection(DatabaseIntrospection):
|
|||||||
self.data_types_reverse.update(self.postgis_types_reverse)
|
self.data_types_reverse.update(self.postgis_types_reverse)
|
||||||
return super().get_field_type(data_type, description)
|
return super().get_field_type(data_type, description)
|
||||||
|
|
||||||
def get_geometry_type(self, table_name, geo_col):
|
def get_geometry_type(self, table_name, description):
|
||||||
"""
|
"""
|
||||||
The geometry type OID used by PostGIS does not indicate the particular
|
The geometry type OID used by PostGIS does not indicate the particular
|
||||||
type of field that a geometry column is (e.g., whether it's a
|
type of field that a geometry column is (e.g., whether it's a
|
||||||
@ -67,11 +67,11 @@ class PostGISIntrospection(DatabaseIntrospection):
|
|||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT * FROM geography_columns
|
SELECT * FROM geography_columns
|
||||||
) AS t WHERE t.f_table_name = %s AND t.f_geometry_column = %s
|
) AS t WHERE t.f_table_name = %s AND t.f_geometry_column = %s
|
||||||
""", (table_name, geo_col))
|
""", (table_name, description.name))
|
||||||
row = cursor.fetchone()
|
row = cursor.fetchone()
|
||||||
if not row:
|
if not row:
|
||||||
raise Exception('Could not find a geometry or geography column for "%s"."%s"' %
|
raise Exception('Could not find a geometry or geography column for "%s"."%s"' %
|
||||||
(table_name, geo_col))
|
(table_name, description.name))
|
||||||
dim, srid, field_type = row
|
dim, srid, field_type = row
|
||||||
# OGRGeomType does not require GDAL and makes it easy to convert
|
# OGRGeomType does not require GDAL and makes it easy to convert
|
||||||
# from OGC geom type name to Django field.
|
# from OGC geom type name to Django field.
|
||||||
|
@ -24,17 +24,17 @@ class GeoFlexibleFieldLookupDict(FlexibleFieldLookupDict):
|
|||||||
class SpatiaLiteIntrospection(DatabaseIntrospection):
|
class SpatiaLiteIntrospection(DatabaseIntrospection):
|
||||||
data_types_reverse = GeoFlexibleFieldLookupDict()
|
data_types_reverse = GeoFlexibleFieldLookupDict()
|
||||||
|
|
||||||
def get_geometry_type(self, table_name, geo_col):
|
def get_geometry_type(self, table_name, description):
|
||||||
with self.connection.cursor() as cursor:
|
with self.connection.cursor() as cursor:
|
||||||
# Querying the `geometry_columns` table to get additional metadata.
|
# Querying the `geometry_columns` table to get additional metadata.
|
||||||
cursor.execute('SELECT coord_dimension, srid, geometry_type '
|
cursor.execute('SELECT coord_dimension, srid, geometry_type '
|
||||||
'FROM geometry_columns '
|
'FROM geometry_columns '
|
||||||
'WHERE f_table_name=%s AND f_geometry_column=%s',
|
'WHERE f_table_name=%s AND f_geometry_column=%s',
|
||||||
(table_name, geo_col))
|
(table_name, description.name))
|
||||||
row = cursor.fetchone()
|
row = cursor.fetchone()
|
||||||
if not row:
|
if not row:
|
||||||
raise Exception('Could not find a geometry column for "%s"."%s"' %
|
raise Exception('Could not find a geometry column for "%s"."%s"' %
|
||||||
(table_name, geo_col))
|
(table_name, description.name))
|
||||||
|
|
||||||
# OGRGeomType does not require GDAL and makes it easy to convert
|
# OGRGeomType does not require GDAL and makes it easy to convert
|
||||||
# from OGC geom type name to Django field.
|
# from OGC geom type name to Django field.
|
||||||
|
@ -9,9 +9,8 @@ class Command(InspectDBCommand):
|
|||||||
def get_field_type(self, connection, table_name, row):
|
def get_field_type(self, connection, table_name, row):
|
||||||
field_type, field_params, field_notes = super().get_field_type(connection, table_name, row)
|
field_type, field_params, field_notes = super().get_field_type(connection, table_name, row)
|
||||||
if field_type == 'GeometryField':
|
if field_type == 'GeometryField':
|
||||||
geo_col = row[0]
|
|
||||||
# Getting a more specific field type and any additional parameters
|
# Getting a more specific field type and any additional parameters
|
||||||
# from the `get_geometry_type` routine for the spatial backend.
|
# from the `get_geometry_type` routine for the spatial backend.
|
||||||
field_type, geo_params = connection.introspection.get_geometry_type(table_name, geo_col)
|
field_type, geo_params = connection.introspection.get_geometry_type(table_name, row)
|
||||||
field_params.update(geo_params)
|
field_params.update(geo_params)
|
||||||
return field_type, field_params, field_notes
|
return field_type, field_params, field_notes
|
||||||
|
@ -208,7 +208,8 @@ Database backend API
|
|||||||
This section describes changes that may be needed in third-party database
|
This section describes changes that may be needed in third-party database
|
||||||
backends.
|
backends.
|
||||||
|
|
||||||
* ...
|
* The second argument of ``DatabaseIntrospection.get_geometry_type()`` is now
|
||||||
|
the row description instead of the column name.
|
||||||
|
|
||||||
Miscellaneous
|
Miscellaneous
|
||||||
-------------
|
-------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user