【发布时间】:2016-10-09 02:45:39
【问题描述】:
我需要添加一个 不是 主键的 autoinc 字段。我正在将一个使用自动递增字段的大型生产数据库迁移到models.UUIDField。我一直在进行分段迁移,现在我的所有关系都与两种字段类型重复。我已准备好进行主键交换,但不幸的是,我仍然需要为旧客户端保留自动递增整数字段,因为它已被弃用。
由于 django 不允许我使用 primary_key=False 定义自动字段(即使这在 db 层完全支持),我正在寻找一个简单的解决方案。我最初的策略是简单地将字段更改为models.BigIntegerField('GUID', db_index=True, null=True, unique=True),然后使用migrations.RunSQL 手动设置默认nextval('my_guid_seq'::regclass)。到目前为止一切顺利,除了没有。事实证明,由于我的 null=True 声明,ORM 层的 django 正在接管并插入 null,这将不允许数据库层的默认值来完成它的工作。
因为糟糕的设计,核心开发人员很快就拒绝了这个请求,我非常同意这一点,但也有非常有效的用例,例如这样。 https://code.djangoproject.com/ticket/8576
我是一个非常薄弱的 django 开发人员,所以我不想在 ORM 层陷入杂草元编程。根据定义,这是一种 hack,所以我正在寻找最简单、最有创意的解决方案来解决这个限制
【问题讨论】:
-
从 'my_guid_seq'::regclass 看你正在使用 postgresql,你可以通过编辑迁移来使用 postgreql 序列。但是,如果您更新您的问题并提及您的真正目标,您可能会得到更好的答案。
-
@e4c5 我有点害怕标记 postgres,因为那部分工作得很好,我不想分散 postgres 社区的注意力。不幸的是,我的问题一直存在于 django 的 ORM 堆栈中。
-
是的,如果你能解释一下这个练习的目的,我们可能会找到方法
-
我的目标是降级我的 autoinc 主键并将我的 UUID 字段用作主键。我没有删除 autoinc 字段,只是将它们降级。是的,所有 fk 都已更新,是的,所有关系都由 UUID 和 autoincs 维护
-
我的目标是第一句话。你是在问我为什么我要从有序大整数切换到 UUID?