Django достигнуто максимальное значение последовательности - PullRequest
2 голосов
/ 25 апреля 2020

Я запускаю программу, которая создает миллионы записей ежедневно, после запуска этой программы в течение года кажется, что я достиг предела идентификатора в моей базе данных postgres.

Полученная ошибка is

django .db.utils.DataError: nextval: достигнуто максимальное значение последовательности "main_records_id_seq" (2147483647)

Есть ли способ продлить максимум идентификатор с использованием SQL или django ORM? Или есть лучшее решение?

Ответы [ 2 ]

4 голосов
/ 25 апреля 2020

Django по умолчанию использует AutoField [Django -doc] для указания значений первичного ключа на стороне базы данных. AutoField - это IntegerField [Django -doc] , а в документации Django говорится:

Целое число. Значения от -2147483648 до 2147483647 безопасны во всех базах данных, поддерживаемых Django.

Вместо них можно использовать BigAutoField [Django -doc] , который будет использовать:

64-разрядное целое число, очень похожее на AutoField, за исключением того, что оно гарантированно соответствует числам от 1 до 9223372036854775807.

Если ваше приложение генерирует 2'147'483'647 за один год, вы можете использовать BigAutoField для 4'294 '967'298 лет.

Таким образом, вы можете определить свою модель как:

class MyModel(models.Model):
    <b>id = models.BigAutoField(primary_key=True)</b>
3 голосов
/ 25 апреля 2020

Это относится только к PostgreSql, ничего общего с Django ORM. Решение, к сожалению, не тривиально, эта хорошая статья, представляющая 4 стратегии миграции идентификаторов БД, с плюсами и минусами.

Краткое описание стратегий:

  1. Измените тип данных с помощью ALTER COLUMN.
  2. Создайте новую таблицу с той же самой схемой с типом bigint и используйте INSERT INTO.
  3. Эта стратегия очень похожа на Стратегию 2, за исключением того, что вместо этого копируя данные в одном запросе SQL, мы медленно копируем фрагменты записей в течение более длительного периода времени.
  4. Добавьте новый столбец в таблицу с типом bigint. Скопируйте значения идентификатора в id_bigint и затем переименуйте новый столбец в id (переименовав существующий идентификатор в id_old).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...