summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2017-04-28 16:27:21 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2017-04-28 16:53:39 +0200
commitd52577b62b3138674807ac74251fab7faed48331 (patch)
tree45435d11d6646bc6a01648de4240fb71526ccdcc
parente93135b067c4f2bfe423e605bdfe0786eaecaef2 (diff)
[1.11.x] Fixed #28138 -- Used output type handler instead of numbersAsStrings on Oracle cursor.
Thanks Tim Graham for the review. Backport of 946775227c56d7a4c6a43343b2e88af837f99f49 from master
-rw-r--r--django/db/backends/oracle/base.py17
1 files changed, 15 insertions, 2 deletions
diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py
index be604455cf..65b5e10909 100644
--- a/django/db/backends/oracle/base.py
+++ b/django/db/backends/oracle/base.py
@@ -400,11 +400,24 @@ class FormatStylePlaceholderCursor(object):
def __init__(self, connection):
self.cursor = connection.cursor()
- # Necessary to retrieve decimal values without rounding error.
- self.cursor.numbersAsStrings = True
+ self.cursor.outputtypehandler = self._output_type_handler
# Default arraysize of 1 is highly sub-optimal.
self.cursor.arraysize = 100
+ @staticmethod
+ def _output_type_handler(cursor, name, defaultType, length, precision, scale):
+ """
+ Called for each db column fetched from cursors. Return numbers as
+ strings so that decimal values don't have rounding error.
+ """
+ if defaultType == Database.NUMBER:
+ return cursor.var(
+ Database.STRING,
+ size=255,
+ arraysize=cursor.arraysize,
+ outconverter=str,
+ )
+
def _format_params(self, params):
try:
return {k: OracleParam(v, self, True) for k, v in params.items()}