4

我在模型上编辑了两个字段并将它们从IntegerFields 更改为TimeFields:

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 对这种迁移感到满意的任何想法?

PS我正在开发中,所以我真的不关心任何数据迁移。您可以假设数据库是空的。

4

3 回答 3

5

由于您不关心数据,因此最简单的方法是删除该列,然后使用 type 再次添加它Time

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

于 2012-06-06T21:47:50.333 回答
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()类似地实现。

于 2012-06-07T10:43:12.930 回答
-1

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

SOUTH_TESTS_MIGRATE = False

进入你的设置文件为我解决了这个问题。

于 2013-12-17T12:09:43.227 回答