Skip to content

Commit

Permalink
Add custom JSON encoder for PostgreSQL (#3442)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
s22su authored and arikfr committed Feb 25, 2019
1 parent b56cc1c commit 75c34bf
Showing 1 changed file with 23 additions and 2 deletions.
25 changes: 23 additions & 2 deletions redash/query_runner/pg.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand All @@ -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:
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 75c34bf

Please sign in to comment.