2016-07-11 16 views
2

用少數CharFields和一個ForeignKey創建Django模型(使用Python 3.5/Django 1.9.7/SQLite)後,運行manage.py makemigrations我去分析創建的SQL代碼manage.py sqlmigrate APP_NAME, MIGRATION_NAME,並對結果感到驚訝。爲什麼Django makemigrations創建模型,將其重命名爲model_old,再次創建並刪除model_old?

任何人都可以解釋爲什麼它正在創建,將表重命名爲model_old,再次創建,將數據從創建/重命名model_old導入剛創建的表,然後刪除model_old表?

我看到最終結果與我真正需要的表格看起來是正確的,我只是想了解它爲什麼這樣做。貝婁是生成的SQL腳本

BEGIN; 
-- 
-- Create model Foo 
-- 
CREATE TABLE "foo_foos" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "name" varchar(250) NOT NULL, "description" varchar(250) NOT NULL,"bar_id" integer NULL REFERENCES "foo_bar" ("id")); 
-- 
-- Alter unique_together for foos (1 constraint(s)) 
-- 
ALTER TABLE "foo_foos" RENAME TO "foo_foos__old"; 
CREATE TABLE "foo_foos" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "name" varchar(250) NOT NULL, "description" varchar(250) NOT NULL,"bar_id" integer NULL REFERENCES "foo_bar" ("id"));; 
INSERT INTO "foo_foos" ("created", "modified", "name", "description", "id", "bar_id") SELECT "created", "modified", "name", "description", "id", "bar_id" FROM "foo_foos__old"; 
DROP TABLE "foo_foos__old"; 
CREATE UNIQUE INDEX "foo_foos_name_42a88411_uniq" ON "foo_foos" ("name", "description"); 
CREATE INDEX "foo_foos_3b5ba656" ON "foo_foos" ("foo_id"); 

COMMIT; 

這裏是模型的樣子:

class Foo(models.Model): 
    name = models.CharField(max_lenght=250) 
    description = models.CharField(max_lenght=250) 
    bar = models.ForeignKey(Bar, on_delete=models.SET_NULL) 

    class Meta: 
     unique_together = ('name', 'description') 

回答

0

它的所有有關的SQLite的Django的仿真,從這裏Django的官方文檔拍攝年代解釋:

SQLite¶

SQLite內置模式更改支持很少,所以Django試圖通過以下方式來模擬它:

Creating a new table with the new schema 
Copying the data across 
Dropping the old table 
Renaming the new table to match the original name 

這個過程一般效果很好,但是它可能會很慢,偶爾也會出現錯誤。不建議您在生產環境中運行和遷移SQLite,除非您非常瞭解風險及其侷限性; Django附帶的支持旨在允許開發人員在其本地計算機上使用SQLite來開發不太複雜的Django項目,而無需使用完整的數據庫

相關問題