使用默认值将Django字段迁移到PostgreSQL数据库

时间:2017-01-06 09:11:23

标签: python django postgresql django-migrations

https://docs.djangoproject.com/en/1.10/topics/migrations/

这里说: “PostgreSQL在模式支持方面是所有数据库中最强大的;唯一需要注意的是,添加具有默认值的列将导致表格的完全重写,与其大小成比例。

“出于这个原因,建议您始终使用 null = True 创建新列,因为这样会立即添加它们。”

我在问我是否正确。 根据我的理解,我应首先用 null = True 创建字段,然后没有默认值然后迁移它,然后给它一个默认值并再次迁移它,值会立即添加,但否则整个数据库将被重写,Django迁移本身不想做这个技巧吗?

2 个答案:

答案 0 :(得分:2)

在同一页面中也提到:

  

此外,MySQL将完全重写几乎每个模式的表   操作并且通常需要与数量成比例的时间   表中的行以添加或删除列。在较慢的硬件上   可能比每百万行差一分钟 - 添加几列   只有几百万行的表格可以锁定您的网站   十分钟。

  

SQLite几乎没有内置的架构更改支持,等等   Django试图通过以下方式模仿它:

     

使用新架构创建新表复制数据   删除旧表重命名新表以匹配原始表   名称

简而言之,你所指的那句话真的是

  

postgresql在添加新列时表现出类似mysql的行为   默认值

您正在尝试的系统将起作用。添加带有null的列意味着不会重写表。然后,您可以将列更改为具有默认值。但是现有的空值将继续为空

答案 1 :(得分:1)

我理解它的方式,在第二次迁移时,默认值不会写入现有行。只有当创建一个没有默认字段值的新行时,才会写入它。

我认为对新列使用null = True的警告只与性能有关。如果您确实希望所有现有行都具有默认值,请使用default =并接受表重写的性能结果。