Django达到了序列的最大值



我正在运行一个每天创建数百万条记录的程序,在运行这个程序一年多后,我的postgres数据库似乎已经达到了id限制。

我收到的错误是

django.db.utils.Data错误:nextval:达到序列"main_records_id_seq"的最大值(2147483647(

有没有办法使用SQL或django-ORM来扩展最大id?或者有更好的解决方案吗?

Django默认使用AutoField[Django-doc]为数据库端的主键指定值。AutoFieldIntegerField[Django-doc],正如Django文档所说:

一个整数。从-21474836482147483647的值在Django支持的所有数据库中都是安全的。

您可以使用BigAutoField[Django-doc],它将使用:

一个64位整数,很像AutoField,只是它保证适合从19223372036854775807的数字。

如果您的应用程序在一年内生成2'147'483'647,则可以使用BigAutoField4'294'967'298年。

因此,您可以将您的模型定义为:

class MyModel(models.Model):
id = models.BigAutoField(primary_key=True)

这只与PostgreSql相关,与Django ORM无关。不幸的是,这个解决方案并不是微不足道的,这是一篇很好的文章,介绍了DB-id迁移的4种策略,有优缺点。

策略摘要:

  1. 使用ALTER COLUMN更改数据类型
  2. 创建一个具有相同架构但类型为bigint的新表,然后使用INSERT INTO
  3. 此策略与策略2非常相似,只是我们没有在一个SQL查询中复制数据,而是缓慢地复制记录更长的时间
  4. 向表中添加类型为bigint的新列。将id值复制到id_bigint,然后将新列重命名为id(通过将现有id重命名为id_old(

最新更新