Django + South - 迁移无法转换列类型 - 希望我使用“USING”

时间:2014-03-10 21:13:03

标签: django postgresql migration django-south

当我尝试运行./manage.py migrate my_app时,我收到此错误:

  

django.db.utils.ProgrammingError:列“关联”无法自动转换为类型整数
  提示:指定USING表达式以执行转换。

这听起来很棒,但我不知道 South 希望我做什么。我应该手动编辑自动生成的python迁移文件吗?如果是这样,我怎么样 - 我没有看到该文件中的标准SQL。相反,我看到了这一点:

# Changing field 'MyTable.associated'
db.alter_column(u'data_mytable', 'associated', 
    self.gf('django.db.models.fields.IntegerField')()
)

另外,为什么没有 South 选择并自动添加USING子句?

2 个答案:

答案 0 :(得分:7)

这是我的肮脏黑客:

  1. 手动添加了一个用于移除offendig字段的migraton,即
  2. migrations.RemoveField( model_name='name_of_the_model', name='offending_field', ) 2.然后我将抱怨迁移的操作从AlterField更改为AddField,即

    migrations.AddField(
            model_name='name_of_model',
            name='name_of_field',
            field=models.ForeignKey(blank=True, null=True, to='ForeignKeyModel'),
            preserve_default=False,
        ),
    

    ```

答案 1 :(得分:2)

您必须将原始db.alter_column替换为db.execute

# Changing field 'MyTable.associated'
# db.alter_column(u'data_mytable', 'associated', 
#     self.gf('django.db.models.fields.IntegerField')()
# )
db.execute(
    'ALTER TABLE "data_mytable" '
    'ALTER COLUMN "associated" DROP DEFAULT, '
    'ALTER COLUMN "associated" DROP NOT NULL, '
    'ALTER COLUMN "associated" TYPE INTEGER '
    'USING '
    'CASE '
    '  WHEN FALSE THEN 0 ELSE 1 '
    'END'
) 

当然,WHEN条件可能会因associated原始类型而发生变化 另请参阅此link