From 6104ab4db4d776303d5e4c604f72e47887ef2c07 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Tue, 5 Oct 2021 22:18:08 +0200 Subject: [PATCH 1/3] sql: use a for loop to iterate on cursors cursor.fetchone() disable prefetching by named cursors. It forces one row at a time iterations and using a while loop is a bizarre idiom for psycopg2 since cursor are perfectly iterable. --- wcs/sql.py | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/wcs/sql.py b/wcs/sql.py index 684b17a1..57f9b16e 100644 --- a/wcs/sql.py +++ b/wcs/sql.py @@ -1227,10 +1227,7 @@ def drop_views(formdef, conn, cur): ('wcs\\_view\\_%',), ) view_names = [] - while True: - row = cur.fetchone() - if row is None: - break + for row in cur: view_names.append(row[0]) for view_name in view_names: @@ -1357,10 +1354,7 @@ def drop_global_views(conn, cur): ('wcs\\_category\\_%',), ) view_names = [] - while True: - row = cur.fetchone() - if row is None: - break + for row in cur: view_names.append(row[0]) for view_name in view_names: @@ -1382,10 +1376,7 @@ def do_global_views(conn, cur): ('wcs\\_view\\_%',), ) existing_views = set() - while True: - row = cur.fetchone() - if row is None: - break + for row in cur: existing_views.add(row[0]) view_names = existing_views.intersection(view_names) @@ -1482,10 +1473,7 @@ class SqlMixin: parameters['offset'] = offset cur.execute(sql_statement, parameters) try: - while True: - row = cur.fetchone() - if row is None: - break + for row in cur: ob = cls._row2ob(row) if ignore_errors and ob is None: continue @@ -1611,10 +1599,7 @@ class SqlMixin: @classmethod def get_objects_iterator(cls, cur, ignore_errors=False, extra_fields=None): - while True: - row = cur.fetchone() - if row is None: - break + for row in cur: yield cls._row2ob(row, extra_fields=extra_fields) @classmethod @@ -1672,6 +1657,7 @@ class SqlMixin: if cls._iterate_on_server: conn = get_connection(isolate=True) cur = conn.cursor(name='select_iterator_%s' % uuid.uuid4()) + cur.itersize = 1 else: conn, cur = get_connection_and_cursor() cur.execute(sql_statement, parameters) @@ -1922,10 +1908,7 @@ class SqlDataMixin(SqlMixin): ) cur.execute(sql_statement, {'id': self.id}) self._evolution = [] - while True: - row = cur.fetchone() - if row is None: - break + for row in cur: self._evolution.append(self._row2evo(row, formdata=self)) conn.commit() cur.close() @@ -1973,10 +1956,7 @@ class SqlDataMixin(SqlMixin): for value in values: value._evolution = [] - while True: - row = cur.fetchone() - if row is None: - break + for row in cur: formdata_id = tuple(row[:8])[7] formdata = object_dict.get(formdata_id) if not formdata: -- 2.33.0