【问题标题】:Cannot get django-activity-stream database tables installed无法安装 django-activity-stream 数据库表
【发布时间】:2012-08-12 13:41:31
【问题描述】:

使用 django-south,是否可以在不应用所有先前迁移的情况下仅将表设置到最后、最新的配置?

我们对使用 3rd 方工具 (django-activity-stream) 很感兴趣,但在运行所有迁移时遇到了困难,原因不明(可能是有关特定字段的 MySQL 问题) - 特别是迁移 003,它会引发错误

_mysql_exceptions.OperationalError: (1170, "BLOB/TEXT column 'object_id' used in key specification without a key length") " 我强烈怀疑避免迁移并直接使用当前架构可以避免这种情况。

不需要向后迁移的能力,只需要让我们立即进入当前架构,我不想破解包来处理这个问题。我似乎无法建立命令,或者这是否可能?

配置:

南 0.7.6、django 1.3.x、mysql 5.5.x、django-activity-stream 0.4.4

【问题讨论】:

  • 我在 django 1.4 上运行迁移时看到同样的错误
  • 非常抱歉,如果我错了,因为没有时间测试,但你为什么不能先执行 manage.py syncdb --all 然后 manage.py migrate --fake?
  • 注意:在上述工作之前,如果在之前的努力中以某种错误状态创建应用程序的表,则需要从数据库中手动删除它们。

标签: mysql django django-south migrate


【解决方案1】:

由于actstream 处理其通用外键的方式而出现此错误。 MySql 出现问题,因为它看到没有任何文本字段 指定长度。

可以通过将迁移 0003 设为无操作来修复此错误。

在actstream中的迁移0003_text_field_ids0004_char_field_ids中更改以下内容:

0003_text_field_ids.py:

  1. 删除def forwards(self, orm)def backwards(self, orm) 中的所有内容,并在两者中写入pass
  2. TextField 更改为PositiveIntegerField

0004_char_field_ids.py:

  1. def backwards(self, orm) 中,将TextField 全部更改为PositiveIntegerField db.altercolumns()

这使得迁移 0003 成为一个 noop,使用前向和后向传递,并使模型的定义使用 PositiveIntegerFields 作为通用外键,因此它们保持与迁移 0001 离开它们时相同的状态。这样做,迁移 0004 可以从 PositiveIntegerFields 拾取到 varChars。然后修复更改迁移 0004,因此向后迁移更改为 PositiveIntegerFields 而不是 TextFields

这有望解决您的问题。

【讨论】:

    【解决方案2】:

    我不认为问题是由迁移引起的,即使syncdb 也会给你同样的结果。

    出现错误是因为 MySQL 只能索引 BLOB 或 TEXT 列的前 N ​​个字符。因此,您必须有一个 TEXT 或 BLOB 类型的字段/列类型,并试图将其作为主键或索引。

    如果没有长度值的完整 BLOB 或 TEXT,MySQL 将无法保证列的唯一性,因为它具有可变和动态大小。因此,当使用 BLOB 或 TEXT 类型作为索引时,必须提供 N 的值,以便 MySQL 可以确定键长度。

    尝试解决此问题,然后尝试应用迁移,它应该可以正常工作。 是的,您可以应用任何迁移并跳过较旧的迁移,但我建议不要这样做,因为这不是应该使用南的方式。

    希望我把事情说清楚了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-03
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多