繁体   English   中英

Django:将 CharField 转换为 TextField,数据保持不变

[英]Django: Convert CharField to TextField with data intact

有没有办法将 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)

但是 DB_MAX_CHAR_LENGTH 是 500,事实证明这个字段有时会超过这个值,所以我想 go 到:

class TestLog(models.Model):
    failed_reqs = models.TextField(blank=True)
    passed_reqs = models.TextField(blank=True)

如何做到这一点并在生产数据库中保持数据完整?

Djangobook详细介绍了如何添加和删除字段,我也尝试过使用 South 来执行此操作,但是 South 给了我一个错误,并且从错误之前查看 output 看起来好像 South 正在删除并重新创建数据库。 这就是南方数据迁移的全部内容吗?

这可以通过 django 迁移 (1.7+) 解决。 如果将类型从 CharField 更改为 TextField,则生成的迁移是 AlterField,它做正确的事情。

顺便说一句,我会继续研究南方的方法。 这是我会尝试的工作流程:

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”字段。

尽管这是很多迁移,但它将每个更改分解为原子迁移。 我先试试这个。 我不确定为什么 South 会删除并重新创建数据库。 在将南添加到您的项目时,您是否运行了 convert_to_south 选项? 我认为这会伪造迁移并让南知道它正在与现有项目而不是新项目合作。

作为替代方案,您可以对数据库执行一些直接 ALTER 以更改列类型,然后将 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;

我强烈建议在进行这些更改之前备份您的数据库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM