From 80ca2a8e539463475003823af09bb9f4dd400c0c Mon Sep 17 00:00:00 2001 From: Sergei Beregov Date: Fri, 15 Feb 2019 22:35:15 +0200 Subject: [PATCH] Add custom JSON encoder for PostgreSQL To handle columns with [range types][1] and display them as a string custom JSON encoder for PostgreSQL was added. Merging this PR will fix issue #1764 [1]:https://www.postgresql.org/docs/9.3/rangetypes.html --- redash/query_runner/pg.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/redash/query_runner/pg.py b/redash/query_runner/pg.py index 96aa03c07d..aecde7e543 100644 --- a/redash/query_runner/pg.py +++ b/redash/query_runner/pg.py @@ -3,9 +3,10 @@ import select import psycopg2 +from psycopg2.extras import Range from redash.query_runner import * -from redash.utils import json_dumps, json_loads +from redash.utils import JSONEncoder, json_dumps, json_loads logger = logging.getLogger(__name__) @@ -28,6 +29,26 @@ } +class PostgreSQLJSONEncoder(JSONEncoder): + def default(self, o): + if isinstance(o, Range): + # From: https://github.com/psycopg/psycopg2/pull/779 + if o._bounds is None: + return '' + + items = [ + o._bounds[0], + str(o._lower), + ', ', + str(o._upper), + o._bounds[1] + ] + + return ''.join(items) + + return super(PostgreSQLJSONEncoder, self).default(o) + + def _wait(conn, timeout=None): while 1: try: @@ -165,7 +186,7 @@ def run_query(self, query, user): data = {'columns': columns, 'rows': rows} error = None - json_data = json_dumps(data, ignore_nan=True) + json_data = json_dumps(data, ignore_nan=True, cls=PostgreSQLJSONEncoder) else: error = 'Query completed but it returned no data.' json_data = None