我清除了Django应用程序上的数据库以重新开始。为此,我删除了数据库文件和现有的迁移,然后重新运行makemigrations
和migrate
。我当然首先要备份数据库。
我很快遇到了一个问题;提交表格后,我得知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__
文件夹,删除所有迁移文件,重新运行makemigrations
和migrate --run-syncdb
。这些都不能解决问题。
应注意,确实确实创建了表topics
,并且与topics
表相关的表格也按预期工作。为什么会这样?
答案 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
实例