Pao*_*olo 6 django casting database-migration django-south
该模型:
class ListContext(models.Model):
content = models.CharField(max_length=200, blank=True)
Run Code Online (Sandbox Code Playgroud)
我使用south来管理模式迁移.
现在我将之前的模型更改为此模型:
from django.contrib.contenttypes.models import ContentType
class ListContext(models.Model):
content = models.ForeignKey(ContentType, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
对于迁移:
$ python manage.py schemamigration --auto page
~ Changed field content on page.ListContext
+ Added index for ['content'] on page.ListContext
Created 0010_auto__chg_field_listcontext_content.py. You can now apply this migration with: ./manage.py migrate page
Run Code Online (Sandbox Code Playgroud)
在此之前一切都很好:
$ python manage.py migrate page
Running migrations for page:
- Migrating forwards to 0010_auto__chg_field_listcontext_content.
> page:0010_auto__chg_field_listcontext_content
FATAL ERROR - The following SQL query failed: ALTER TABLE "page_page_listcontext" ALTER
COLUMN "content_id" TYPE integer, ALTER COLUMN "content_id" DROP NOT NULL, ALTER COLUMN
"content_id" DROP DEFAULT;
The error was: column "content_id" cannot be cast to type integer
Error in migration: page:0010_auto__chg_field_listcontext_content
Run Code Online (Sandbox Code Playgroud)
我可以猜测在从字符串转换为int期间发生错误,但是如何避免这种情况并完成迁移?
它有什么不同,我不关心保存表中存储的数据.
如果您手动编辑转发功能:
重命名该列:
db.rename_column('sometable', 'content', 'content_old')
Run Code Online (Sandbox Code Playgroud)
然后将您的列添加回来:
db.add_column('sometable', 'content', self.gf('django.db.models.fields.IntegerField')(default=0))
Run Code Online (Sandbox Code Playgroud)
然后执行一个查询,通过查找 id 来更新新字段。
db.execute("""
UPDATE sometable SET content =
(SELECT FKTable.id FROM FKTable
WHERE (FKTable.content = sometable.content_old AND
sometable.content_old != '')
OR (FKTable.content = 'none' AND sometable.content_old = '')) --Maybe cut the OR out
""")
Run Code Online (Sandbox Code Playgroud)
然后你必须做一些奇特的事情才能使倒退正常工作。
| 归档时间: |
|
| 查看次数: |
1952 次 |
| 最近记录: |