【问题标题】:Change from "unqiue=True" to "unique=False" in django在 django 中从“unqiue=True”更改为“unique=False”
【发布时间】:2010-01-13 10:29:52
【问题描述】:

我有一个带有 CharField 的模型,该模型之前将“唯一”设置为 True,但现在更改为 False。但是当我尝试用存在的东西保存该字段时,django 仍然会引发 IntegrityError。

我怎样才能改变这种行为,以便它允许非不同的值?

数据库是 MySQL。

【问题讨论】:

    标签: mysql django unique-key


    【解决方案1】:

    我建议使用http://south.aeracode.org,它是一个适用于 Django 的数据库迁移应用程序,它允许在不接触 MySQL shell/admin 的情况下进行此类更改。这样,您就有了一种可重播的宏,用于将任何计算机更新到最新的数据库方案。

    使用它就像他们在这里写的一样简单:http://south.aeracode.org/wiki/ConvertingAnApp

    【讨论】:

      【解决方案2】:

      删除唯一索引。

      【讨论】:

      • 我假设您的意思是删除 MySQL 表上的唯一索引? (只是为了避免让 Django 新手感到困惑,他们可能认为索引应该在 Django 模型中删除)
      • 好的,我试过这个:'ALTER TABLE tblname DROP INDEX fieldname' 但这没有用。仍然存在完整性错误。
      • 您确定您发出的查询运行正确吗?您应该首先检查表中索引的名称。您可以发出 SHOW INDEX FROM mytable FROM mydb;针对您的数据库,它应该在该表中显示索引 - 然后您可以删除唯一的。
      • 这行得通,我在尝试删除索引时使用了错误的名称,但在我列出索引并获得正确的名称后,我设法解决了它。因此,在您更改为 unique=False 后,请执行此操作。显示来自 mytable 的索引 FROM mydb; ALTER TABLE mytable DROP INDEX 索引名;
      • 这是部分解决方案,但是基于 sqlite 的单元测试,在创建表后无法删除约束呢?
      【解决方案3】:

      在重新运行 Web 应用程序之前,您是否确保在命令行中使用“python manage.py syncdb”命令重新同步了 django 中的数据库?这可能会解决您的问题。

      【讨论】:

      • syncdb 从不接触现有的表,所以这不能解决问题。迁移工具,如南,会。
      【解决方案4】:

      我试图做同样的事情,发现从 django-south 0.5 开始,South 不会为你处理这个问题。

      就像之前的 cmets 中所说的,您可能应该先创建南迁移,但随后您将不得不手动进入并删除 django 在执行第一个 syncdb 时最初创建的唯一索引。

      use mydb;
      desc mytable;
      

      这将向您显示表的架构,并且您将看到该字段在键列中的值仍为“UNI”。

      SHOW INDEX FROM mytable FROM mydb;
      

      应该是一个将 Non_unique 设置为 0 的索引。

      ALTER TABLE mytable DROP INDEX indexname;
      

      如果您再次查看表架构,您会发现“UNI”不再位于键列中。

      【讨论】:

        猜你喜欢
        • 2019-05-30
        • 2021-10-03
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-02
        • 2020-11-25
        相关资源
        最近更新 更多