From 946775227c56d7a4c6a43343b2e88af837f99f49 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Fri, 28 Apr 2017 16:27:21 +0200 Subject: [PATCH] =?UTF-8?q?Fixed=20#28138=20--=20Used=20=E2=80=8Boutput=20?= =?UTF-8?q?type=20handler=20instead=20of=20numbersAsStrings=20on=20Oracle?= =?UTF-8?q?=20=E2=80=8Bcursor.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks Tim Graham for the review. --- django/db/backends/oracle/base.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index 0f3ca46d98..65aac70b9e 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -385,11 +385,24 @@ class FormatStylePlaceholderCursor: 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 # The default for cx_Oracle < 5.3 is 50. 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()}