【问题标题】:Django db_index=True not create index after migrationDjango db_index=True 迁移后不创建索引
【发布时间】:2019-12-30 20:26:44
【问题描述】:

我有一个抽象模型:

class ChronoModel(models.Model):
    created = models.DateTimeField(
        u"Create time",
        auto_now_add=True,
        db_index=True
    )
    modified = models.DateTimeField(
        u"Last change time",
        auto_now_add=True,
        db_index=True
    )

    class Meta(object):
        abstract = True
        ordering = ('-created', )

我有几个从 ChronoModel 继承的模型。我的问题对所有人来说都是一样的——例如以下模型之一:

class BatchSession(ChronoModel):
    spent_seconds = models.BigIntegerField(
        u"spent_seconds", default=0, editable=False)
    max_seconds = models.BigIntegerField(
        u"max_seconds", null=True, blank=True)
    comment = models.CharField(
        u"comment", max_length=255, null=True, blank=False, 
unique=True)

    class Meta(ChronoModel.Meta):
        verbose_name = u'Session'
        verbose_name_plural = u'Sessions'
        ordering = ('-modified',)
        db_table = 'check_batchsession'

    def __unicode__(self):
        return u'#{}, {}/{} sec'.format(
            self.id, self.spent_seconds, self.max_seconds)

创建和应用迁移后,“创建”和“修改”字段没有索引

命令

python manage.py sqlmigrate app_name 0001 | grep INDEX

给我看

BEGIN;
....
CREATE INDEX `check_batchsession_e2fa5388` ON `check_batchsession` (`created`);
CREATE INDEX `check_batchsession_9ae73c65` ON `check_batchsession` (`modified`);
....
COMMIT;

但是mysql返回我:

mysql> SHOW INDEX FROM check_batchsession;
+--------------------+------------+--------------------------------------------------+--------------+-------------+
| Table              | Non_unique | Key_name                                         | Seq_in_index | Column_name |
+--------------------+------------+--------------------------------------------------+--------------+-------------+
| check_batchsession |          0 | PRIMARY                                          |            1 | id          |
| check_batchsession |          0 | check_batchsession_comment_558191ed0a395dfa_uniq |            1 | comment     |
+--------------------+------------+--------------------------------------------------+--------------+-------------+
2 rows in set (0,00 sec)

我该如何解决? Django 1.8.18 MySQL 5.6

【问题讨论】:

  • 您是否真正创建并运行迁移?
  • 你做了migrate你的数据库?
  • 真的是老代码了。第一次迁移是由南进行的,我不能保证迁移成功。我在旧提交中找到了我的模型:“'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), " and "'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime .now', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'})" 在我的模型中。
  • 我的新迁移是由 Django 1.7 创建的并且是伪造的。我可以在所有模型上重新创建索引吗?

标签: mysql django django-models django-migrations mysql-5.6


【解决方案1】:

这是 Django South 的麻烦。

我不知道发生了什么,因为我的所有索引都没有创建。 (如果有人知道 - 请写在 cmets 中)

我的解决方案:

1) 从 ChronoModel 的所有字段中删除 db_index=True 2) 迁移 3) 迁移 3) 将 db_index=True 添加到 ChronoModel 中的所有字段 4) 迁移 5) 迁移

我的所有索引都已恢复

【讨论】:

    猜你喜欢
    • 2017-05-25
    • 2019-05-26
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2021-01-10
    • 2015-08-12
    • 2017-10-03
    • 2021-01-21
    相关资源
    最近更新 更多