Django 1.4 TimeField迁移在PostgreSQL上失败

时间:2012-06-06 20:40:08

标签: django postgresql django-models django-south django-1.4

我在模型上编辑了两个字段,并将它们从IntegerField更改为TimeField s:

class Model(models.Model):
    start_time = models.TimeField()
    end_time = models.TimeField()

我正在使用这两个字段来保存一个天真的时间,这与任何地理时间概念无关,因此没有真正的“时区”(想想类似于比赛时间的事情)。我的本地数据库是PostgreSQL。

但是,此更改生成的南迁移失败,并出现以下错误:

> main:0005_auto__chg_field_model_start_time__chg_field_model_end_time
FATAL ERROR - The following SQL query failed: ALTER TABLE "main_model" ALTER COLUMN "start_time" TYPE time, ALTER COLUMN "start_time" SET NOT NULL, ALTER COLUMN "start_time" DROP DEFAULT;

...

File ".../lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute
    return self.cursor.execute(query, args)
django.db.utils.DatabaseError: column "start_time" cannot be cast to type time without time zone

失败的迁移有这个:

class Migration(SchemaMigration):

    def forwards(self, orm):

        # Changing field 'Model.start_time'
        db.alter_column('main_model', 'start_time', self.gf('django.db.models.fields.TimeField')())

        # Changing field 'Model.end_time'
        db.alter_column('main_model', 'end_time', self.gf('django.db.models.fields.TimeField')())

关于如何让postgres对此迁移感到高兴的任何想法?

P.S。我正处于开发阶段,所以我真的不关心任何数据迁移。您可以假设数据库为空。

3 个答案:

答案 0 :(得分:5)

由于您不关心数据,最简单的方法是删除列,然后使用类型Time再次添加。

手动编辑当前迁移以执行此操作。或者删除此迁移,然后注释该字段并运行schemamigration --auto,然后添加该字段并再次运行。

答案 1 :(得分:0)

我最终手动编辑了迁移脚本(感谢@Maccesch),以便所有alter_column()次调用都被delete_column()替换为add_column()

请注意,这意味着无法完成数据迁移,此移植前存在的所有数据都将被删除。

代码:

def forwards(self, orm):

    # NOTE: NO MIGRATION HERE!!
    # THIS _WILL_ CAUSE DATA LOSS

    # Changing field 'Model.start_time'
    db.delete_column('main_model', 'start_time')
    db.add_column('main_model', 'start_time', self.gf('django.db.models.fields.TimeField')())

    # Changing field 'Model.end_time'
    db.delete_column('main_model', 'end_time')
    db.add_column('main_model', 'end_time', self.gf('django.db.models.fields.TimeField')())

backwards()同样实施。

答案 2 :(得分:0)

我也遇到过这个问题,问题在于创建新测试数据库时南方的迁移。放置

SOUTH_TESTS_MIGRATE = False

进入您的设置文件为我解决了问题。