1

我清除了我的 Django 应用程序上的数据库以重新开始。我通过删除数据库文件和现有迁移然后重新运行makemigrationsmigrate. 我当然先备份了数据库。

我很快遇到了一个问题;提交表格后,我被告知The table 'topics__old' does not exist.我认为这很奇怪,因为我已经命名了我所有的表格,而那不是其中之一。以下是相关模型:

class Topic(models.Model, FormatDateMixin):

    topic_id = models.UUIDField(primary_key=True,
        default=uuid.uuid4,
        editable=False)

    submitted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    comment = models.TextField(max_length=150)
    created_date = models.DateTimeField(default=timezone.now)

    class Meta:
        db_table = 'topics'

class TopicUpdate(models.Model, FormatDateMixin):
    update_id = models.UUIDField(primary_key=True,
        default=uuid.uuid4,
        editable=False)

    original_topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    submitted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    comment = models.TextField(max_length=150)
    update_date = models.DateTimeField(default=timezone.now)

    class Meta:
        db_table = 'topic_updates'

我检查了旧工作版本和当前版本的数据库文件,发现以下内容:

原表:
CREATE TABLE "topic_updates" ("update_id" char(32) NOT NULL PRIMARY KEY, ... "original_topic_id" char(32) NOT NULL REFERENCES "topics" ("topic_id") DEFERRABLE INITIALLY DEFERRED, ...

新表:
CREATE TABLE "topic_updates" ("update_id" char(32) NOT NULL PRIMARY KEY, ... "original_topic_id" char(32) NOT NULL REFERENCES "topics__old" ("topic_id") DEFERRABLE INITIALLY DEFERRED, ...

正如您在创建数据库时看到的那样,Django__old在引用外键时附加到表名,这会导致应用程序中的错误topics__old不存在。

我试过删除所有__pycache__文件夹,删除所有迁移文件,重新运行makemigrationsmigrate --run-syncdb. 这些都没有解决问题。

应该注意的是,它确实按预期创建了表格topics和与表格相关的表格。topics为什么会这样?

4

1 回答 1

0

做了一些 grepping 并发现其中__old导致django/db/backends/sqlite3/schema.py我找到了根本原因。

原来这是由 SQLite 更新引起的,Django 已将修复推送到: https ://github.com/django/django/commit/894cb13779e6d092974c873bd2cf1452554d2e06

SQLite 3.26 改变了表和列重命名操作的行为以重新指向外键引用,即使外键检查被禁用。这使得在 SQLite 3.26+ 上不需要模拟这种行为的变通方法。

然而,这个更新似乎还没有进入 pypi 或 ubuntu/debian 存储库,尽管已经有两个多星期了,所以我不得不pip install从 git 存储库中删除我的 django 实例。

于 2018-12-19T04:51:57.207 回答