0

我想了解我经常看到的指令。在特里顿是什么for sub_ids in grouped_slice(ids)意思?

这是使用此类指令的方法的片段:

@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
4

1 回答 1

1

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 作为计数参数)。

于 2022-01-26T11:23:34.193 回答