Почему 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 правильно. Как я могу убедиться, что возвращаются правильные строки или что строки не пропускаются?