我在模型上编辑了两个字段,并将它们从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。我正处于开发阶段,所以我真的不关心任何数据迁移。您可以假设数据库为空。
答案 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
进入您的设置文件为我解决了问题。