【问题标题】:What happens when a Django table hits max on an ID/PK column?当 Django 表在 ID/PK 列上达到最大值时会发生什么?
【发布时间】:2016-11-21 22:08:53
【问题描述】:

假设您有一个应用程序,其中一个特定的表创建了很多新对象(在 Django 术语中)。没关系删除了多少,但假设它足以保持表的功能。

一段时间后,该表在 ID/PK 列上达到最大值,这可能是多么不可能。接下来发生什么? Django 如何处理这种情况?

【问题讨论】:

  • 你试过了吗?尝试一下似乎并不难。
  • 还没有。想知道在去那里之前是否有人对此有任何经验。
  • 对于 postgres,您可以将对象的 id 设置为 2147483647,然后尝试再添加一个。
  • Django 不处理这个。会发生什么取决于您的数据库。
  • @allcaps 我认为 postgresql 使用 bigserial 作为 id,但我想使用 serial 是有意义的。

标签: django django-database


【解决方案1】:

我尝试使用 Postgres 数据库设置 2147483648 的 ID。 Django 提出DataError: integer out of range。如果我在 Postgres 中尝试相同的操作,我会得到 [22003] ERROR: integer out of range。所以看起来 Django 只是抛出了 db 错误。

如果我在 Django 源代码中搜索 DataError,我会发现: https://github.com/django/django/blob/3c447b108ac70757001171f7a4791f493880bf5b/django/db/utils.py#L53 确认 Django 重新抛出后端特定的数据库异常。

您始终可以自己定义主键字段并将其标记为主键:

 id = models.BigIntegerField(primary_key=True)

这会将 id 的形式从 2147483647 增加到 9223372036854775807。

如果这还不够,请切换到 uuid:

id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

https://docs.djangoproject.com/en/1.10/topics/db/models/#automatic-primary-key-fieldshttps://docs.djangoproject.com/en/1.10/ref/models/fields/#bigintegerfieldhttps://docs.djangoproject.com/en/1.10/ref/models/fields/#uuidfield

【讨论】:

  • 请注意,1.10 添加了BigAutoField——以防您想保持自动递增行为。
  • 这个答案太棒了。它还表明,如果问题发生,可以迁移出问题。我知道我可以将外键设置为我自己的数据类型。问这个问题的目的是,我真的不知道错误会如何自我显示,而且我无法通过搜索找到任何东西。
猜你喜欢
  • 2015-02-23
  • 2012-01-24
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
相关资源
最近更新 更多