当 Django table 在 ID/PK 列上达到最大值时会发生什么?
What happens when a Django table hits max on an ID/PK column?
假设您有一个应用程序,其中特定 table 创建了很多新对象(在 Django 术语中)。不管删除了多少,但假设足以保持 table 功能。
过了一段时间后,table 达到了 ID/PK 列的最大值,这是多么不可能。接下来发生什么? Django 如何处理这种情况?
我尝试使用 Postgres 数据库设置 id 2147483648。 Django 加注 DataError: integer out of range
。如果我在 Postgres 中尝试相同的方法,我会得到 [22003] ERROR: integer out of range
。所以看起来 Django 只是抛出数据库错误。
如果我在 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-fields and https://docs.djangoproject.com/en/1.10/ref/models/fields/#bigintegerfield and https://docs.djangoproject.com/en/1.10/ref/models/fields/#uuidfield
假设您有一个应用程序,其中特定 table 创建了很多新对象(在 Django 术语中)。不管删除了多少,但假设足以保持 table 功能。
过了一段时间后,table 达到了 ID/PK 列的最大值,这是多么不可能。接下来发生什么? Django 如何处理这种情况?
我尝试使用 Postgres 数据库设置 id 2147483648。 Django 加注 DataError: integer out of range
。如果我在 Postgres 中尝试相同的方法,我会得到 [22003] ERROR: integer out of range
。所以看起来 Django 只是抛出数据库错误。
如果我在 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-fields and https://docs.djangoproject.com/en/1.10/ref/models/fields/#bigintegerfield and https://docs.djangoproject.com/en/1.10/ref/models/fields/#uuidfield