40 lines
1.5 KiB
Python
40 lines
1.5 KiB
Python
|
from django.contrib.gis.db.backend import SpatialBackend
|
||
|
from django.db.models.query import insert_query
|
||
|
|
||
|
if SpatialBackend.oracle:
|
||
|
from django.db import connection
|
||
|
from django.db.models.sql.subqueries import InsertQuery
|
||
|
|
||
|
class OracleGeoInsertQuery(InsertQuery):
|
||
|
def insert_values(self, insert_values, raw_values=False):
|
||
|
"""
|
||
|
This routine is overloaded from InsertQuery so that no parameter is
|
||
|
passed into cx_Oracle for NULL geometries. The reason is that
|
||
|
cx_Oracle has no way to bind Oracle object values (like
|
||
|
MDSYS.SDO_GEOMETRY).
|
||
|
"""
|
||
|
placeholders, values = [], []
|
||
|
for field, val in insert_values:
|
||
|
if hasattr(field, 'get_placeholder'):
|
||
|
ph = field.get_placeholder(val)
|
||
|
else:
|
||
|
ph = '%s'
|
||
|
|
||
|
placeholders.append(ph)
|
||
|
self.columns.append(field.column)
|
||
|
|
||
|
# If 'NULL' for the placeholder, omit appending None
|
||
|
# to the values list (which is used for db params).
|
||
|
if not ph == 'NULL':
|
||
|
values.append(val)
|
||
|
if raw_values:
|
||
|
self.values.extend(values)
|
||
|
else:
|
||
|
self.params += tuple(values)
|
||
|
self.values.extend(placeholders)
|
||
|
|
||
|
def insert_query(model, values, return_id=False, raw_values=False):
|
||
|
query = OracleGeoInsertQuery(model, connection)
|
||
|
query.insert_values(values, raw_values)
|
||
|
return query.execute_sql(return_id)
|