簡體   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