2017-03-01 46 views
0

我有一個模型,其中包含一個created_at字段,它是一個models.DateTimeField。由於時間不再需要,我想將它遷移到models.DateField。我改變模式,運行makemigrations,並將其應用到我的數據庫。我愚蠢地認爲數據會被遷移。沒有,所有created_at字段現在是None從DateTimeField遷移到DateField

如何轉換現有數據以便日期仍然可用?

這裏是所生成的遷移文件:

# -*- coding: utf-8 -*- 
# Generated by Django 1.10.5 on 2017-03-01 15:07 
from __future__ import unicode_literals 

import datetime 
from django.db import migrations, models 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('aion', '0003_auto_20160125_0948'), 
    ] 

    operations = [ 
     migrations.AlterField(
      model_name='assembly', 
      name='created_at', 
      field=models.DateField(default=datetime.date.today, verbose_name='date created'), 
     ), 
    ] 

該數據庫是在SQLite的測試運行一個。真正的在MySQL上運行...

$ python manage.py sqlmigrate aion 0004_auto_20170301_1507 
BEGIN; 
-- 
-- Alter field created_at on assembly 
-- 
ALTER TABLE "aion_assembly" RENAME TO "aion_assembly__old"; 
CREATE TABLE "aion_assembly" ("created_at" date NOT NULL, "description" text NOT NULL, "serial_number" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "status" varchar(32) NOT NULL, "manufacturer_serial_number" varchar(128) NULL, "supplier_reference" varchar(128) NULL, "sap" varchar(128) NULL, "location_number_field" varchar(128) NULL, "customer_equipment_reference" varchar(128) NULL, "configurator_id" integer NULL REFERENCES "aion_configurator" ("id"), "created_by_id" integer NOT NULL REFERENCES "auth_user" ("id"), "customer_id" integer NULL REFERENCES "organisations_customer" ("id"), "locality_id" integer NULL REFERENCES "aion_location" ("id"), "project_code_id" integer NULL REFERENCES "project_codes_projectcode" ("id"), "supplier_id" integer NULL REFERENCES "organisations_supplier" ("id"), "contained_in_id" integer NULL REFERENCES "aion_assembly" ("serial_number")); 
INSERT INTO "aion_assembly" ("status", "customer_equipment_reference", "manufacturer_serial_number", "description", "supplier_reference", "created_at", "created_by_id", "project_code_id", "contained_in_id", "locality_id", "supplier_id", "location_number_field", "customer_id", "serial_number", "configurator_id", "sap") SELECT "status", "customer_equipment_reference", "manufacturer_serial_number", "description", "supplier_reference", "created_at", "created_by_id", "project_code_id", "contained_in_id", "locality_id", "supplier_id", "location_number_field", "customer_id", "serial_number", "configurator_id", "sap" FROM "aion_assembly__old"; 
DROP TABLE "aion_assembly__old"; 
CREATE INDEX "aion_assembly_cc6edc4a" ON "aion_assembly" ("configurator_id"); 
CREATE INDEX "aion_assembly_e93cb7eb" ON "aion_assembly" ("created_by_id"); 
CREATE INDEX "aion_assembly_cb24373b" ON "aion_assembly" ("customer_id"); 
CREATE INDEX "aion_assembly_7e3ea948" ON "aion_assembly" ("locality_id"); 
CREATE INDEX "aion_assembly_f56bb38b" ON "aion_assembly" ("project_code_id"); 
CREATE INDEX "aion_assembly_c5bcd634" ON "aion_assembly" ("supplier_id"); 
CREATE INDEX "aion_assembly_e71ddfe4" ON "aion_assembly" ("contained_in_id"); 
COMMIT; 
+0

「不,所有created_at字段現在都是'None'。」這讓我感到驚訝。你使用的是哪個數據庫?你可以[編輯]你的問題並添加遷移文件? – Chris

+0

什麼數據庫引擎? – Chris

+0

SQLite很棒,但它處理一些與其他數據庫引擎完全不同的事情。總的來說,儘可能將您的開發環境與您的生產環境緊密配合是一個不錯的主意。這包括數據庫引擎。 (a)請運行['manage.py sqlmigrate '](https://docs.djangoproject.com/en/1.10/ref/django-admin/#django-admin-sqlmigrate)並添加上面的結果。 (這將向您展示Django爲您的遷移生成的SQL。)(b)如果可能,請嘗試在MySQL數據庫上遷移。我懷疑它會在那裏工作。 – Chris

回答

1

SQLite是驚人的,但它並不總是像其他數據庫一樣。也許關於SQLite的相關事實包括:

正如你所看到的,使用SQLite Django的工作時,實際上創建從舊的一個,當你修改列的新表,並複製數據。

我並不完全確定SQLite在你的情況下發生了什麼,但由於你在生產中使用MySQL,所以我推薦在開發中使用MySQL。我們已經看到,這種遷移在MySQL下按預期工作。