Все запросы вернули 200 OK, а записи пропали. Как пагинация незаметно теряет данные

Corner324 58 минут назад Краткое содержание статьи Все запросы вернули 200 OK, а записи пропали. Как пагинация незаметно теряет данные Простой 7 мин 1.3K Python * Проектирование API * Big Data * Туториал Из песочницы...
Will Anthropic be the #3 AI Lab at the end of November 2026 (Style Control On)?
Значимый прорыв формирует отрасль ИИ: Corner324 58 минут назад Краткое содержание статьи Все запросы вернули 200 OK, а записи пропали. Как пагинация незаметно теряет данные Простой 7 мин 1. 3K Python * Проектирование API * Big Data * Туториал Из песочницы Всем привет!
Меня зовут Александр, я работаю с ETL на Python: забираю данные из чужих API и складываю их в базу. В этой работе меня больше всего пугают не те ошибки, после которых скрипт падает с трейсбеком. С ними все понятно: упало, пошел чинить.
Технические детали
Хуже те, после которых в логе стоит «готово». Одна из таких связана с пагинацией: API на каждый запрос ответил 200, загрузчик дошел до последней страницы, а в базе одной записи не хватает и еще одна лежит дважды. В статье покажу, откуда это берется при обычном обходе по offset, воспроизведу без сети на 30 строках и расскажу, как искать такие потери в выгрузке, которая уже прошла.
В конце будет короткий список вопросов, которые стоит задать своему загрузчику. Он каждую ночь забирает записи из API, и ошибок в логах у него нет. def load_rides(): rides, offset = , 0 while True: page = requests.
get(URL, params={"offset": offset, "limit": 100}). json() if len(page) < 100: break rides += page offset += 100 save_to_db(rides)Таймауты и проверку статуса ответа оставлю в стороне — это отдельная тема. В самом обходе страниц здесь три проблемы: теряется последняя страница, обход сдвигается при изменении данных, у цикла нет предела.
Отраслевые последствия
Последняя страница не попадает в результатif len(page) < 100: break стоит раньше, чем rides += page. Если последняя страница неполная, код отбрасывает ее целиком. В дни, когда число записей делится на 100, все сходится, поэтому потерю можно не замечать месяцами.
Обход по offset дублирует и теряет записи, если данные меняютсяЗапрос с offset=3 API понимает так: отсортировать все, что есть сейчас, пропустить три записи и отдать следующие. О том, где вы остановились в прошлый раз, он ничего не знает. Загрузчик помнит, сколько записей пропустить, а не на какой записи он остановился.
Если между двумя запросами список изменился, под тем же номером лежит уже другая запись. Возьмем шесть поездок, страницы по три, новые первыми. Загрузчик забрал первую страницу.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.



