我正在运行一个每天创建数百万条记录的程序,在运行这个程序一年多后,我的postgres数据库似乎已经达到了id限制。
我收到的错误是
django.db.utils.Data错误:nextval:达到序列"main_records_id_seq"的最大值(2147483647(
有没有办法使用SQL或django-ORM来扩展最大id?或者有更好的解决方案吗?
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):
id = models.BigAutoField(primary_key=True)
这只与PostgreSql相关,与Django ORM无关。不幸的是,这个解决方案并不是微不足道的,这是一篇很好的文章,介绍了DB-id迁移的4种策略,有优缺点。
策略摘要:
- 使用ALTER COLUMN更改数据类型
- 创建一个具有相同架构但类型为bigint的新表,然后使用INSERT INTO
- 此策略与策略2非常相似,只是我们没有在一个SQL查询中复制数据,而是缓慢地复制记录更长的时间
- 向表中添加类型为bigint的新列。将id值复制到id_bigint,然后将新列重命名为id(通过将现有id重命名为id_old(