我有一个 django 项目,其中包含一个已经包含数据的数据库表。我想更改字段名称而不会丢失该列中的任何数据。我最初的计划是简单地更改模型字段名称,而不会实际更改 db 表的名称(使用db_column
column 参数):
原型号:
class Foo(models.Model):
orig_name = models.CharField(max_length=50)
新型号:
class Foo(models.Model):
name = models.CharField(max_length=50, db_column='orig_name')
但是,运行 South'sschemamigration --auto
会生成一个迁移脚本,该脚本会删除原始列 ,orig_name
并添加一个新列 ,name
这会产生删除该列中数据的不良副作用。(我也很困惑 South 为什么要更改数据库中列的名称,因为我对 db_column 的理解是它可以在不更改数据库表列名称的情况下更改模型字段名称)。
如果我无法在不更改 db 字段的情况下更改模型字段,我想我可以像这样进行更直接的名称更改:
原型号:
class Foo(models.Model):
orig_name = models.CharField(max_length=50)
新型号:
class Foo(models.Model):
name = models.CharField(max_length=50)
无论我最终使用哪种策略(我更喜欢第一种,但会发现第二种可以接受),我主要关心的是确保我不会丢失该列中已经存在的数据。
这需要一个多步骤的过程吗?(例如 1. 添加一列,2. 将数据从旧列迁移到新列,以及 3. 删除原始列)或者我可以用类似的东西更改迁移脚本db.alter_column
吗?
在更改列名的同时保留该列中的数据的最佳方法是什么?