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