更改现有 Django 应用程序中主键的最佳方法是什么?

2023-12-08

我有一个处于测试模式的应用程序。这个应用程序的模型有一些带有显式primary_key的类。因此 Django 使用这些字段并且不会自动创建 id。

class Something(models.Model):
    name = models.CharField(max_length=64, primary_key=True)

我认为这是一个坏主意(参见在 django admin 中保存对象时出现 unicode 错误)并且我想返回并为我的模型的每个类都有一个 id。

class Something(models.Model):
    name = models.CharField(max_length=64, db_index=True)

我已经对模型进行了更改(将每个 Primary_key=True 替换为 db_index=True),并且我想使用以下命令迁移数据库south.

不幸的是,迁移失败并显示以下消息:ValueError: You cannot add a null=False column without a default value.

我正在评估此问题的不同解决方法。有什么建议么?

感谢您的帮助


同意,您的模型可能是错误的。

正式主键应始终是代理键。从来没有别的事。 [言辞强烈。自 20 世纪 80 年代以来一直担任数据库设计师。重要的教训是:一切都是可以改变的,即使用户在母亲的坟墓上发誓价值不能改变,这确实是一个可以作为主要的自然钥匙。这不是主要的。只有代理才能成为主要代理。]

你正在进行心脏直视手术。不要搞乱架构迁移。你是替换架构。

  1. 将数据卸载到 JSON 文件中。为此,请使用 Django 自己的内部 django-admin.py 工具。您应该为每个将要更改的表以及依赖于正在创建的键的每个表创建一个卸载文件。单独的文件使这变得更容易一些。

  2. 删除要从旧架构中更改的表。

    依赖于这些表的表的 FK 将会改变;你可以 就地更新行或者——这可能更简单——删除并重新插入 这些行也。

  3. 创建新架构。这只会创建正在更改的表。

  4. 编写脚本来读取数据并使用新密钥重新加载数据。这些都很短而且非常相似。每个脚本都会使用json.load()从源文件中读取对象;然后,您将从为您构建的 JSON 元组行对象创建模式对象。然后您可以将它们插入数据库。

    你有两个案例。

    • PK 更改的表将被插入并获得新的 PK。这些必须“级联”到其他表,以确保其他表的 FK 也发生更改。

    • 具有发生更改的 FK 的表必须在外部表中定位该行并更新其 FK 引用。

选择。

  1. 重命名所有旧表。

  2. 创建整个新架构。

  3. 编写SQL将所有数据从旧模式迁移到新模式。这将必须巧妙地重新分配键。

  4. 删除重命名的旧表。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改现有 Django 应用程序中主键的最佳方法是什么? 的相关文章

随机推荐