summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDick Marinus <dick@mrns.nl>2017-08-19 08:48:41 +0200
committerDick Marinus <dick@mrns.nl>2017-08-21 08:50:28 +0200
commit223eec9d2c0f0ff83cacf26a8273b2f280e3751b (patch)
tree4c0548c6c119edbebcd7689560a63382374e9e9d
parent2fe9fe801f6e7cf4f64e6315af10eb7407766f24 (diff)
use cursor from psycopg in pgcli
-rw-r--r--changelog.rst1
-rwxr-xr-xpgcli/main.py25
2 files changed, 18 insertions, 8 deletions
diff --git a/changelog.rst b/changelog.rst
index 5fd9853b..a38d1318 100644
--- a/changelog.rst
+++ b/changelog.rst
@@ -14,6 +14,7 @@ Internal changes:
-----------------
* Preliminary work for a future change in outputting results that uses less memory. (Thanks: `Dick Marinus`_)
* Remove import workaround for OrderedDict, required for python < 2.7. (Thanks: `Andrew Speed`_)
+* Use less memory when formatting results for display (Thanks: `Dick Marinus`_).
Bug Fixes:
----------
diff --git a/pgcli/main.py b/pgcli/main.py
index 65588474..f3aa0d7f 100755
--- a/pgcli/main.py
+++ b/pgcli/main.py
@@ -63,6 +63,7 @@ except ImportError:
from getpass import getuser
from psycopg2 import OperationalError, InterfaceError
+import psycopg2
from collections import namedtuple
@@ -1010,21 +1011,29 @@ def format_output(title, cur, headers, status, settings):
if cur:
headers = [case_function(utf8tounicode(x)) for x in headers]
- rows = list(cur)
- formatted = formatter.format_output(rows, headers, **output_kwargs)
-
+ if max_width is not None:
+ cur = list(cur)
+ column_types = None
+ if hasattr(cur, 'description'):
+ column_types = []
+ for d in cur.description:
+ if d[1] in psycopg2.extensions.DECIMAL.values or \
+ d[1] in psycopg2.extensions.FLOAT.values:
+ column_types.append(float)
+ if d[1] == psycopg2.extensions.INTEGER.values or \
+ d[1] in psycopg2.extensions.LONGINTEGER.values:
+ column_types.append(int)
+ else:
+ column_types.append(text_type)
+ formatted = formatter.format_output(cur, headers, **output_kwargs)
if isinstance(formatted, (text_type)):
formatted = iter(formatted.splitlines())
-
first_line = next(formatted)
formatted = itertools.chain([first_line], formatted)
- if max_width:
- formatted = list(formatted)
-
if (not expanded and max_width and len(first_line) > max_width and headers):
formatted = formatter.format_output(
- rows, headers, format_name='vertical', **output_kwargs)
+ cur, headers, format_name='vertical', column_types=None, **output_kwargs)
if isinstance(formatted, (text_type)):
formatted = iter(formatted.splitlines())