Django达到了序列的最大值

cob*_*ysh 4 django postgresql django-orm

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

我收到的错误是

django.db.utils.DataError:nextval:达到序列“main_records_id_seq”的最大值(2147483647)

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

Wil*_*sem 8

Django 默认使用AutoField[Django-doc]来指定数据库端主键的值。AnAutoField是一个IntegerField[Django-doc],正如 Django 文档所述:

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

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

64 位整数,与 an 非常相似,AutoField不同之处在于它保证适合从1到 的9223372036854775807数字。

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

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

class MyModel(models.Model):
    id = models.BigAutoField(primary_key=True)
Run Code Online (Sandbox Code Playgroud)

  • @HoratiuJeflea:如果我将“id”字段添加到测试项目的模型中,它确实会进行迁移,并且对于 PostgreSQL,它会更改该字段(使用“sqlmigrate”您可以检查查询)。 (3认同)
  • @HoratiuJeflea 迁移是由 Django 自动处理的,并且实际上应用得非常快。 (3认同)

Hor*_*lea 6

这仅与 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)。