【发布时间】:2021-08-02 04:16:20
【问题描述】:
不要混淆。我不询问如何在 Django 中删除列。我的问题是 Django 从 SQLite 数据库中删除列的实际操作。
最近我看到一篇文章说你不能在 SQLite 数据库中删除列。所以你必须删除表并重新创建它。很奇怪,如果 SQLite 不支持,那么 Django 是如何做到的?
是在做this吗?
【问题讨论】:
标签: django database sqlite django-orm ddl
不要混淆。我不询问如何在 Django 中删除列。我的问题是 Django 从 SQLite 数据库中删除列的实际操作。
最近我看到一篇文章说你不能在 SQLite 数据库中删除列。所以你必须删除表并重新创建它。很奇怪,如果 SQLite 不支持,那么 Django 是如何做到的?
是在做this吗?
【问题讨论】:
标签: django database sqlite django-orm ddl
要删除 SQLite 数据库中的列,Django 遵循此处描述的过程:https://www.sqlite.org/lang_altertable.html#caution
简单来说就是新建表,从旧表复制数据,删除旧表,然后重命名新表。
从source code [GitHub] 我们可以看到SQLite 的模式编辑器在remove_field 方法中调用self._remake_table(model, delete_field=field),这是用于删除列的方法。方法_remake_table 在它的code 中有以下文档字符串,它描述了该过程是如何执行的:
将模型从 old_model 转换为 new_model 的快捷方式 遵循正确的程序来执行非重命名或列添加 基于 SQLite 文档的操作 https://www.sqlite.org/lang_altertable.html#caution 必备 步骤是:
- 使用更新后的定义创建一个名为“new__app_model”的表
- 将现有“app_model”表中的数据复制到新表中
- 删除“app_model”表
- 将“new__app_model”表重命名为“app_model”
- 恢复之前“app_model”表的任何索引。
【讨论】: