有没有办法将CharField更改为TextField并保持此列中的数据完好无损?
现在我有以下内容:
class TestLog(models.Model):
failed_reqs = models.CharField(max_length=DB_MAX_CHAR_LENGTH, blank=True)
passed_reqs = models.CharField(max_length=DB_MAX_CHAR_LENGTH, blank=True)
Run Code Online (Sandbox Code Playgroud)
但是DB_MAX_CHAR_LENGTH是500,因为事实证明这个字段有时会超过它,所以我想去:
class TestLog(models.Model):
failed_reqs = models.TextField(blank=True)
passed_reqs = models.TextField(blank=True)
Run Code Online (Sandbox Code Playgroud)
如何执行此操作并将数据保持在生产数据库中?
Djangobook详细介绍了如何添加和删除字段,我也尝试使用South来执行此操作,但是South给了我一个错误,并查看错误之前的输出,好像South正在删除并重新创建数据库.这是南方数据迁移的全部意义吗?
在手边,我会继续研究南方的方法.这是我尝试的工作流程:
1)南模式迁移创建两个新的TextField字段,称为"failed_reqs_txt"和"passed_reqs_txt".
2)创建数据迁移以将数据从旧字段迁移到新字段
3)创建模式迁移以删除原始的"failed_reqs"和"passed_reqs"字段.
----如果您需要字段与原始字段相同,我将继续:
4)创建模式迁移以将"failed_reqs"和"passed_reqs"添加为TextFields
5)创建数据迁移以从"failed_reqs_txt"和"passed_reqs_txt"迁移到"failed_reqs"和"passed_reqs"字段.
6)创建模式迁移以删除"failed_reqs_txt"和"passed_reqs_txt"字段.
虽然这是很多迁移,但它会将每次更改分解为原子迁移.我先试试这个.我不确定为什么南方会丢弃并重新创建数据库.在向项目添加南方时是否运行了convert_to_south选项?我认为这会假装迁移,让南方知道它正在与现有项目合作,而不是新项目.
作为替代方法,您可以对数据库执行一些直接的ALTERS来更改列类型,然后将model.py从CharField更新为TextField. Postgres,据说支持以这种方式隐式改变数据类型.(参见第5.5.6节.)我不确定mysql,但我认为它的工作原理相同.(CharField到TextFiled应该是兼容的转换)
无论如何,在进行任何此类更改之前,我会备份我的数据.希望这可以帮助.
假设您可以访问数据库,正如您提到Django谈论添加和删除列的方式,我已经列出了Postgresql和MySQL的方法,因为您没有提到您正在使用的内容.
Postgresql:
BEGIN;
ALTER TABLE "TestLog"
ALTER COLUMN "failed_reqs" TYPE TEXT,
ALTER COLUMN "passed_reqs" TYPE TEXT;
COMMIT;
MySQL:
BEGIN;
ALTER TABLE TestLog
MODIFY failed_reqs TEXT NULL,
MODIFY passed_reqs TEXT NULL;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
我强烈建议您在进行这些更改之前备份数据库.
| 归档时间: |
|
| 查看次数: |
3963 次 |
| 最近记录: |