在 Tryton 中 grouped_slice(ids) 中的 sub_ids 是什么意思?
What does mean for sub_ids in grouped_slice(ids) in Tryton?
我想理解一个我看过很多的指令。 for sub_ids in grouped_slice(ids)
在 Tryton 中是什么意思?
这是使用此类指令的方法片段:
@classmethod
def get_duration(cls, works, name):
pool = Pool()
Line = pool.get('timesheet.line')
transaction = Transaction()
cursor = transaction.connection.cursor()
context = transaction.context
table_w = cls.__table__()
line = Line.__table__()
ids = [w.id for w in works]
durations = dict.fromkeys(ids, None)
where = Literal(True)
if context.get('from_date'):
where &= line.date >= context['from_date']
if context.get('to_date'):
where &= line.date <= context['to_date']
if context.get('employees'):
where &= line.employee.in_(context['employees'])
query_table = table_w.join(line, 'LEFT',
condition=line.work == table_w.id)
for sub_ids in grouped_slice(ids):
red_sql = reduce_ids(table_w.id, sub_ids)
cursor.execute(*query_table.select(table_w.id, Sum(line.duration),
where=red_sql & where,
group_by=table_w.id))
for work_id, duration in cursor:
# SQLite uses float for SUM
if duration and not isinstance(duration, datetime.timedelta):
duration = datetime.timedelta(seconds=duration)
durations[work_id] = duration
return durations
grouped_slice 是我们在 tryton 中使用的一个函数,用于读取多个子集中的对象列表(默认数量取决于数据库后端。例如,该值在 PostgreSQL 后端为 2000)。
这用于限制我们传递给数据库的参数数量,因为当输入记录的数量大于 sql 驱动程序接受的最大参数数量时,这可能会导致一些问题。
这是一个简单的示例,直观地展示了一切是如何工作的:
>>> from trytond.tools import grouped_slice
>>> ids = list(range(0, 30))
>>> for i, sub_ids in enumerate(grouped_slice(ids, count=10)):
... print("Loop", i, ','.join(map(str, sub_ids)))
...
Loop 0 0,1,2,3,4,5,6,7,8,9
Loop 1 10,11,12,13,14,15,16,17,18,19
Loop 2 20,21,22,23,24,25,26,27,28,29
如您所见,我们有一个包含 30 个 ID 的列表,它们以 10 个为一组进行处理(因为我使用 10 作为计数参数)。
我想理解一个我看过很多的指令。 for sub_ids in grouped_slice(ids)
在 Tryton 中是什么意思?
这是使用此类指令的方法片段:
@classmethod
def get_duration(cls, works, name):
pool = Pool()
Line = pool.get('timesheet.line')
transaction = Transaction()
cursor = transaction.connection.cursor()
context = transaction.context
table_w = cls.__table__()
line = Line.__table__()
ids = [w.id for w in works]
durations = dict.fromkeys(ids, None)
where = Literal(True)
if context.get('from_date'):
where &= line.date >= context['from_date']
if context.get('to_date'):
where &= line.date <= context['to_date']
if context.get('employees'):
where &= line.employee.in_(context['employees'])
query_table = table_w.join(line, 'LEFT',
condition=line.work == table_w.id)
for sub_ids in grouped_slice(ids):
red_sql = reduce_ids(table_w.id, sub_ids)
cursor.execute(*query_table.select(table_w.id, Sum(line.duration),
where=red_sql & where,
group_by=table_w.id))
for work_id, duration in cursor:
# SQLite uses float for SUM
if duration and not isinstance(duration, datetime.timedelta):
duration = datetime.timedelta(seconds=duration)
durations[work_id] = duration
return durations
grouped_slice 是我们在 tryton 中使用的一个函数,用于读取多个子集中的对象列表(默认数量取决于数据库后端。例如,该值在 PostgreSQL 后端为 2000)。
这用于限制我们传递给数据库的参数数量,因为当输入记录的数量大于 sql 驱动程序接受的最大参数数量时,这可能会导致一些问题。
这是一个简单的示例,直观地展示了一切是如何工作的:
>>> from trytond.tools import grouped_slice
>>> ids = list(range(0, 30))
>>> for i, sub_ids in enumerate(grouped_slice(ids, count=10)):
... print("Loop", i, ','.join(map(str, sub_ids)))
...
Loop 0 0,1,2,3,4,5,6,7,8,9
Loop 1 10,11,12,13,14,15,16,17,18,19
Loop 2 20,21,22,23,24,25,26,27,28,29
如您所见,我们有一个包含 30 个 ID 的列表,它们以 10 个为一组进行处理(因为我使用 10 作为计数参数)。