Django在创建数据库时创建对错误表的外键引用

时间:2018-12-19 03:00:03

标签: django sqlite django-2.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表相关的表格也按预期工作。为什么会这样?

1 个答案:

答案 0 :(得分:0)

经过一番摸索,在__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存储库,因此我不得不从git repo中删除django和pip install实例

相关问题