Почему sql пропускает строки в моем собственном django bulk create?

Я создал метод для перезаписи bulk_create для определенных запросов, так что я получаю pk, возвращаемый из моей базы данных MYSQL.

def dict_fetch_all(cursor):
    """Return all rows from a cursor as a dict"""
    columns = [col[0] for col in cursor.description]
    return [
        dict(zip(columns, row))
        for row in cursor.fetchall()
    ]

class BulkQueryManager(models.Manager):

    def bulk_create_return_with_id(self, objs, batch_size=2000):
        self._for_write = True
        fields = [f for f in self.model._meta.concrete_fields if not isinstance(f, AutoField)]
        created_objs = []
        with transaction.atomic(using=self.db):
            with connections[self.db].cursor() as cursor:
                for item in [objs[i:i + batch_size] for i in range(0, len(objs), batch_size)]:
                    query = sql.InsertQuery(self.model)
                    query.insert_values(fields, item)
                    for raw_sql, params in query.get_compiler(using=self.db).as_sql():
                        cursor.execute(raw_sql, params)

                    print('last row id: ', cursor.lastrowid, 'count: ', cursor.rowcount)

                    raw = "SELECT * FROM %s WHERE id >= %s ORDER BY id DESC LIMIT %s" % (
                        self.model._meta.db_table, cursor.lastrowid, cursor.rowcount
                    )

                    print(raw)
                    cursor.execute(raw)
                    created_objs.extend(dict_fetch_all(cursor))
                    print(created_objs)

        post_save.send(item.__class__, instance=item, created=True)
        return created_objs

Однако created_objs не всегда совпадает с моими входными objs. Очень редко возвращаются неправильные объекты. Мой cursor.lastrowid всегда правильный, но кажется, что первые несколько строк иногда пропускаются.

Например:

вывод на печать:

last row id:  155407411 count:  22

вывод на печать:

SELECT * FROM product_research_offer WHERE id >= 155407411 ORDER BY id DESC LIMIT 22

упрощенный вывод на печать:

[{'id': 155407434}, {'id': 155407433}, {'id': 155407432}, {'id': 155407431}, {'id': 155407430}, {'id': 155407429}, {'id': 155407428}, {'id': 155407427}, {'id': 155407426}, {'id': 155407425}, {'id': 155407424}, {'id': 155407423}, {'id': 155407422}, {'id': 155407421}, {'id': 155407420}, {'id': 155407419}, {'id': 155407418}, {'id': 155407417}, {'id': 155407416}, {'id': 155407415}, {'id': 155407414}, {'id': 155407413}]

Как вы можете видеть, возвращаемый 'id' начинается с 155407413 вместо 155407411. Хотя 155407411 - это правильный id, и ограничение в 22 правильно. Как я могу убедиться, что возвращаются правильные строки или что строки не пропускаются?

Вернуться на верх