mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
Fixed #12637 -- GeoDjango's inspectdb command is now a subclass of Django's, and works with all spatial backends (Oracle and SpatiaLite did work before). This changeset introduces new introspection modules for all of the spatial backends and adds hooks to the original inspectdb.Command class to enable reuse.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12257 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
from django.db.backends.oracle.base import *
|
||||
from django.db.backends.oracle.base import DatabaseWrapper as OracleDatabaseWrapper
|
||||
from django.contrib.gis.db.backends.oracle.creation import OracleCreation
|
||||
from django.contrib.gis.db.backends.oracle.introspection import OracleIntrospection
|
||||
from django.contrib.gis.db.backends.oracle.operations import OracleOperations
|
||||
|
||||
class DatabaseWrapper(OracleDatabaseWrapper):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(DatabaseWrapper, self).__init__(*args, **kwargs)
|
||||
self.creation = OracleCreation(self)
|
||||
self.ops = OracleOperations(self)
|
||||
self.creation = OracleCreation(self)
|
||||
self.introspection = OracleIntrospection(self)
|
||||
|
||||
39
django/contrib/gis/db/backends/oracle/introspection.py
Normal file
39
django/contrib/gis/db/backends/oracle/introspection.py
Normal file
@@ -0,0 +1,39 @@
|
||||
import cx_Oracle
|
||||
from django.db.backends.oracle.introspection import DatabaseIntrospection
|
||||
|
||||
class OracleIntrospection(DatabaseIntrospection):
|
||||
# Associating any OBJECTVAR instances with GeometryField. Of course,
|
||||
# this won't work right on Oracle objects that aren't MDSYS.SDO_GEOMETRY,
|
||||
# but it is the only object type supported within Django anyways.
|
||||
data_types_reverse = DatabaseIntrospection.data_types_reverse.copy()
|
||||
data_types_reverse[cx_Oracle.OBJECT] = 'GeometryField'
|
||||
|
||||
def get_geometry_type(self, table_name, geo_col):
|
||||
cursor = self.connection.cursor()
|
||||
try:
|
||||
# Querying USER_SDO_GEOM_METADATA to get the SRID and dimension information.
|
||||
try:
|
||||
cursor.execute('SELECT "DIMINFO", "SRID" FROM "USER_SDO_GEOM_METADATA" WHERE "TABLE_NAME"=%s AND "COLUMN_NAME"=%s',
|
||||
(table_name.upper(), geo_col.upper()))
|
||||
row = cursor.fetchone()
|
||||
except Exception, msg:
|
||||
raise Exception('Could not find entry in USER_SDO_GEOM_METADATA corresponding to "%s"."%s"\n'
|
||||
'Error message: %s.' % (table_name, geo_col, msg))
|
||||
|
||||
# TODO: Research way to find a more specific geometry field type for
|
||||
# the column's contents.
|
||||
field_type = 'GeometryField'
|
||||
|
||||
# Getting the field parameters.
|
||||
field_params = {}
|
||||
dim, srid = row
|
||||
if srid != 4326:
|
||||
field_params['srid'] = srid
|
||||
# Length of object array ( SDO_DIM_ARRAY ) is number of dimensions.
|
||||
dim = len(dim)
|
||||
if dim != 2:
|
||||
field_params['dim'] = dim
|
||||
finally:
|
||||
cursor.close()
|
||||
|
||||
return field_type, field_params
|
||||
Reference in New Issue
Block a user