From 9c81cb6a4a9744868df7b56cc7b2b37df13dcfc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sun, 21 Mar 2021 16:09:13 +0100 Subject: [PATCH] Replace cursor fetchall by iteration over cursor issue5817 review335831003 --- trytond/admin.py | 2 +- trytond/backend/postgresql/database.py | 2 +- trytond/backend/postgresql/table.py | 10 +++++----- trytond/backend/sqlite/database.py | 2 +- trytond/backend/sqlite/table.py | 7 +++---- trytond/cache.py | 2 +- trytond/ir/lang.py | 2 +- trytond/ir/model.py | 8 ++++---- trytond/ir/note.py | 2 +- trytond/ir/trigger.py | 6 +++--- trytond/model/fields/many2one.py | 2 +- trytond/model/modelsql.py | 12 +++++------- trytond/modules/__init__.py | 27 +++++++++++++------------- trytond/tools/multivalue.py | 2 +- 14 files changed, 41 insertions(+), 45 deletions(-) diff --git a/trytond/admin.py b/trytond/admin.py index 10f4c94719..7be6188c2b 100644 --- a/trytond/admin.py +++ b/trytond/admin.py @@ -44,7 +44,7 @@ def run(options): lang = Table('ir_lang') cursor.execute(*lang.select(lang.code, where=lang.translatable == Literal(True))) - lang = set([x[0] for x in cursor.fetchall()]) + lang = set([x[0] for x in cursor]) lang.add(main_lang) else: lang = set() diff --git a/trytond/backend/postgresql/database.py b/trytond/backend/postgresql/database.py index 96eba7c359..556bd86ec8 100644 --- a/trytond/backend/postgresql/database.py +++ b/trytond/backend/postgresql/database.py @@ -356,7 +356,7 @@ class Database(DatabaseInterface): try: cursor.execute( 'SELECT hostname FROM ir_configuration') - hostnames = {h for h, in cursor.fetchall() if h} + hostnames = {h for h, in cursor if h} if hostnames and hostname not in hostnames: return False except ProgrammingError: diff --git a/trytond/backend/postgresql/table.py b/trytond/backend/postgresql/table.py index ef2bc38260..ec48b7bf14 100644 --- a/trytond/backend/postgresql/table.py +++ b/trytond/backend/postgresql/table.py @@ -139,7 +139,7 @@ class TableHandler(TableHandlerInterface): 'FROM information_schema.columns ' 'WHERE table_name = %s AND table_schema = %s', (self.table_name, self.table_schema)) - for column, typname, nullable, size, default in cursor.fetchall(): + for column, typname, nullable, size, default in cursor: self._columns[column] = { 'typname': typname, 'notnull': True if nullable == 'NO' else False, @@ -153,7 +153,7 @@ class TableHandler(TableHandlerInterface): 'FROM information_schema.table_constraints ' 'WHERE table_name = %s AND table_schema = %s', (self.table_name, self.table_schema)) - self._constraints = [c for c, in cursor.fetchall()] + self._constraints = [c for c, in cursor] # add nonstandard exclude constraint cursor.execute('SELECT c.conname ' @@ -167,7 +167,7 @@ class TableHandler(TableHandlerInterface): "AND r.relkind IN ('r', 'p') " 'AND r.relname = %s AND nr.nspname = %s', (self.table_name, self.table_schema)) - self._constraints.extend((c for c, in cursor.fetchall())) + self._constraints.extend((c for c, in cursor)) cursor.execute('SELECT k.column_name, r.delete_rule ' 'FROM information_schema.key_column_usage AS k ' @@ -176,7 +176,7 @@ class TableHandler(TableHandlerInterface): 'AND r.constraint_name = k.constraint_name ' 'WHERE k.table_name = %s AND k.table_schema = %s', (self.table_name, self.table_schema)) - self._fk_deltypes = dict(cursor.fetchall()) + self._fk_deltypes = dict(cursor) if indexes: # Fetch indexes defined for the table @@ -187,7 +187,7 @@ class TableHandler(TableHandlerInterface): "JOIN pg_class cl2 on (cl2.oid = ind.indexrelid) " "WHERE cl.relname = %s AND n.nspname = %s", (self.table_name, self.table_schema)) - self._indexes = [l[0] for l in cursor.fetchall()] + self._indexes = [l[0] for l in cursor] @property def _field2module(self): diff --git a/trytond/backend/sqlite/database.py b/trytond/backend/sqlite/database.py index e95829dd2c..8b8ff5ab74 100644 --- a/trytond/backend/sqlite/database.py +++ b/trytond/backend/sqlite/database.py @@ -526,7 +526,7 @@ class Database(DatabaseInterface): configuration.hostname)) except Exception: return False - hostnames = {h for h, in cursor.fetchall() if h} + hostnames = {h for h, in cursor if h} if hostnames and hostname not in hostnames: return False return True diff --git a/trytond/backend/sqlite/table.py b/trytond/backend/sqlite/table.py index 3924c68a35..5a8e270500 100644 --- a/trytond/backend/sqlite/table.py +++ b/trytond/backend/sqlite/table.py @@ -54,8 +54,7 @@ class TableHandler(TableHandlerInterface): temp_sql = sql.replace(table_name, '_temp_%s' % table_name) cursor.execute(temp_sql) cursor.execute('PRAGMA table_info("' + table_name + '")') - columns = ['"%s"' % column for _, column, _, _, _, _ - in cursor.fetchall()] + columns = ['"%s"' % column for _, column, _, _, _, _ in cursor] cursor.execute(('INSERT INTO "_temp_%s" ' '(' + ','.join(columns) + ') ' 'SELECT ' + ','.join(columns) @@ -131,7 +130,7 @@ class TableHandler(TableHandlerInterface): if columns: cursor.execute('PRAGMA table_info("' + self.table_name + '")') self._columns = {} - for _, column, type_, notnull, hasdef, _ in cursor.fetchall(): + for _, column, type_, notnull, hasdef, _ in cursor: column = re.sub(r'^\"|\"$', '', column) match = re.match(r'(\w+)(\((.*?)\))?', type_) if match: @@ -153,7 +152,7 @@ class TableHandler(TableHandlerInterface): cursor.execute('PRAGMA index_list("' + self.table_name + '")') except IndexError: # There is sometimes IndexError cursor.execute('PRAGMA index_list("' + self.table_name + '")') - self._indexes = [l[1] for l in cursor.fetchall()] + self._indexes = [l[1] for l in cursor] @property def _field2module(self): diff --git a/trytond/cache.py b/trytond/cache.py index 187f09730d..081301e7c7 100644 --- a/trytond/cache.py +++ b/trytond/cache.py @@ -205,7 +205,7 @@ class MemoryCache(BaseCache): cursor.execute(*table.select( _cast(table.timestamp), table.name)) timestamps = {} - for timestamp, name in cursor.fetchall(): + for timestamp, name in cursor: timestamps[name] = timestamp modules = _get_modules(cursor) finally: diff --git a/trytond/ir/lang.py b/trytond/ir/lang.py index 3126d4f0c6..9e4debdb09 100644 --- a/trytond/ir/lang.py +++ b/trytond/ir/lang.py @@ -589,7 +589,7 @@ def get_parent_language(code): cursor = Transaction().connection.cursor() lang = Table('ir_lang') cursor.execute(*lang.select(lang.code, lang.parent)) - _parents.update(cursor.fetchall()) + _parents.update(cursor) if _parents.get(code): return _parents[code] for sep in ['@', '_']: diff --git a/trytond/ir/model.py b/trytond/ir/model.py index e9ab3a7ec6..c5294ac610 100644 --- a/trytond/ir/model.py +++ b/trytond/ir/model.py @@ -420,7 +420,7 @@ class ModelField(ModelSQL, ModelView): model = Model.__table__() cursor.execute(*model.select(model.id, model.model, where=model.id.in_(model_ids))) - id2model = dict(cursor.fetchall()) + id2model = dict(cursor) trans_args = [] for rec in res: @@ -578,7 +578,7 @@ class ModelAccess(DeactivableMixin, ModelSQL, ModelView): group_by=ir_model.model)) raw_access = { m: {'read': r, 'write': w, 'create': c, 'delete': d} - for m, r, w, c, d in cursor.fetchall()} + for m, r, w, c, d in cursor} for model in models: access[model] = { @@ -774,7 +774,7 @@ class ModelFieldAccess(DeactivableMixin, ModelSQL, ModelView): & (group.active == Literal(True))) | (field_access.group == Null)), group_by=[ir_model.model, model_field.name])) - for m, f, r, w, c, d in cursor.fetchall(): + for m, f, r, w, c, d in cursor: accesses[m][f] = {'read': r, 'write': w, 'create': c, 'delete': d} for model, maccesses in accesses.items(): cls._get_access_cache.set((user, model), maccesses) @@ -1257,7 +1257,7 @@ class ModelData(ModelSQL, ModelView): cursor = Transaction().connection.cursor() cursor.execute(*table.select(table.model, group_by=[table.model])) - models = [m[0] for m in cursor.fetchall()] + models = [m for m, in cursor] cls._has_model_cache.set(None, models) return model in models diff --git a/trytond/ir/note.py b/trytond/ir/note.py index bbc85ad1b4..355d7d3186 100644 --- a/trytond/ir/note.py +++ b/trytond/ir/note.py @@ -60,7 +60,7 @@ class Note(ResourceMixin, ModelSQL, ModelView): Case((read.user != Null, False), else_=True), where=where) cursor.execute(*query) - unread.update(cursor.fetchall()) + unread.update(cursor) return unread @classmethod diff --git a/trytond/ir/trigger.py b/trytond/ir/trigger.py index d00fd2e983..f1dc426fae 100644 --- a/trytond/ir/trigger.py +++ b/trytond/ir/trigger.py @@ -85,7 +85,7 @@ class Trigger(DeactivableMixin, ModelSQL, ModelView): cursor.execute(*sql_table.select( sql_table.id, sql_table.minimum_delay, where=sql_table.minimum_delay != Null)) - for id_, delay in cursor.fetchall(): + for id_, delay in cursor: delay = datetime.timedelta(hours=delay) cursor.execute(*sql_table.update( [sql_table.minimum_time_delay], @@ -218,7 +218,7 @@ class Trigger(DeactivableMixin, ModelSQL, ModelView): trigger_log.record_id, Count(Literal(1)), where=red_sql & (trigger_log.trigger == self.id), group_by=trigger_log.record_id)) - number = dict(cursor.fetchall()) + number = dict(cursor) for record_id in sub_ids: if record_id not in number: new_ids.append(record_id) @@ -256,7 +256,7 @@ class Trigger(DeactivableMixin, ModelSQL, ModelView): trigger_log.record_id, Max(trigger_log.create_date), where=(red_sql & (trigger_log.trigger == self.id)), group_by=trigger_log.record_id)) - delay = dict(cursor.fetchall()) + delay = dict(cursor) for record_id in sub_ids: if record_id not in delay: new_ids.append(record_id) diff --git a/trytond/model/fields/many2one.py b/trytond/model/fields/many2one.py index 628c0be969..8d2c76f963 100644 --- a/trytond/model/fields/many2one.py +++ b/trytond/model/fields/many2one.py @@ -125,7 +125,7 @@ class Many2One(Field): right = getattr(Target, self.right).sql_column(table) cursor.execute(*table.select(left, right, where=red_sql)) where = Or() - for l, r in cursor.fetchall(): + for l, r in cursor: if operator.endswith('child_of'): where.append((left >= l) & (right <= r)) else: diff --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py index 0115767563..bbc18fbc7e 100644 --- a/trytond/model/modelsql.py +++ b/trytond/model/modelsql.py @@ -1082,7 +1082,7 @@ class ModelSQL(ModelStorage): for sub_ids in grouped_slice(ids): where = reduce_ids(field.sql_column(table), sub_ids) cursor.execute(*table.select(table.id, where=where)) - tree_ids[fname] += [x[0] for x in cursor.fetchall()] + tree_ids[fname] += [x[0] for x in cursor] has_translation = any( getattr(f, 'translate', False) and not hasattr(f, 'set') @@ -1119,7 +1119,7 @@ class ModelSQL(ModelStorage): Column(foreign_table, field_name), sub_ids) cursor.execute(*foreign_table.select(foreign_table.id, where=foreign_red_sql)) - records = Model.browse([x[0] for x in cursor.fetchall()]) + records = Model.browse([x[0] for x in cursor]) else: with transaction.set_context(active_test=False): records = Model.search([(field_name, 'in', sub_ids)]) @@ -1375,7 +1375,7 @@ class ModelSQL(ModelStorage): & (history.create_date == Null) & (history.write_date <= transaction.context['_datetime']))) - for deleted_id, delete_date in cursor.fetchall(): + for deleted_id, delete_date in cursor: history_date, _ = ids_history[deleted_id] if isinstance(history_date, str): strptime = datetime.datetime.strptime @@ -1506,9 +1506,7 @@ class ModelSQL(ModelStorage): cursor.execute(*table.select(table.id, where=Column(table, parent) == parent_id)) - childs = cursor.fetchall() - - for child_id, in childs: + for child_id, in cursor: right = cls._rebuild_tree(parent, child_id, right) field = cls._fields[parent] @@ -1607,7 +1605,7 @@ class ModelSQL(ModelStorage): cursor.execute(*table.select(*columns, where=where)) where = Literal(False) - for row in cursor.fetchall(): + for row in cursor: clause = table.id != row[0] for column, operator, value in zip( sql.columns, sql.operators, row[1:]): diff --git a/trytond/modules/__init__.py b/trytond/modules/__init__.py index 01524a0773..e7e2353624 100644 --- a/trytond/modules/__init__.py +++ b/trytond/modules/__init__.py @@ -210,7 +210,7 @@ def load_module_graph(graph, pool, update=None, lang=None): for sub_modules in tools.grouped_slice(modules): cursor.execute(*ir_module.select(ir_module.name, ir_module.state, where=ir_module.name.in_(list(sub_modules)))) - module2state.update(cursor.fetchall()) + module2state.update(cursor) modules = set(modules) for node in graph: @@ -391,7 +391,7 @@ def load_modules( cursor.execute(*ir_module.select(ir_module.name, where=ir_module.state.in_(('activated', 'to upgrade', 'to remove')))) - module_list = [name for (name,) in cursor.fetchall()] + module_list = [name for (name,) in cursor] graph = None while graph is None: module_list += update @@ -410,23 +410,22 @@ def load_modules( if update: cursor.execute(*ir_module.select(ir_module.name, where=(ir_module.state == 'to remove'))) - fetchall = cursor.fetchall() - if fetchall: - for (mod_name,) in fetchall: - # TODO check if ressource not updated by the user - cursor.execute(*ir_model_data.select( + for mod_name, in cursor: + res = False + # TODO check if ressource not updated by the user + with transaction.connection.cursor() as cursor_delete: + cursor_delete.execute(*ir_model_data.select( ir_model_data.model, ir_model_data.db_id, where=(ir_model_data.module == mod_name), order_by=ir_model_data.id.desc)) - for rmod, rid in cursor.fetchall(): + for rmod, rid in cursor_delete: Model = pool.get(rmod) Model.delete([Model(rid)]) - Transaction().connection.commit() - cursor.execute(*ir_module.update([ir_module.state], - ['not activated'], - where=(ir_module.state == 'to remove'))) - Transaction().connection.commit() - res = False + transaction.connection.commit() + cursor.execute(*ir_module.update([ir_module.state], + ['not activated'], + where=(ir_module.state == 'to remove'))) + transaction.connection.commit() Module = pool.get('ir.module') Module.update_list() diff --git a/trytond/tools/multivalue.py b/trytond/tools/multivalue.py index 4c746c840d..921bd0b98a 100644 --- a/trytond/tools/multivalue.py +++ b/trytond/tools/multivalue.py @@ -89,7 +89,7 @@ def migrate_property( vcolumns = [Column(table, f) for f in fields] values = [] length = len(value_names) - for row in cursor.fetchall(): + for row in cursor: value = [c(v) for v, c in zip(row, casts)] if parent: value.append(