官方文檔的解釋如下:
Django 有一個自動執行數據庫遷移並同步管理你的數據庫結構的命令 - 這個命令是 migrate
,我們馬上就會接觸它 - 但是首先,讓我們看看遷移命令會執行哪些 SQL 語句。sqlmigrate
命令接收一個遷移的名稱,然后返回對應的 SQL:
$ python manage.py sqlmigrate polls 0001
你將會看到類似下面這樣的輸出(我把輸出重組成了人類可讀的格式):
BEGIN; -- -- Create model Choice -- CREATE TABLE "polls_choice" ( "id" serial NOT NULL PRIMARY KEY, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL ); -- -- Create model Question -- CREATE TABLE "polls_question" ( "id" serial NOT NULL PRIMARY KEY, "question_text" varchar(200) NOT NULL, "pub_date" timestamp with time zone NOT NULL ); -- -- Add field question to choice -- ALTER TABLE "polls_choice" ADD COLUMN "question_id" integer NOT NULL; ALTER TABLE "polls_choice" ALTER COLUMN "question_id" DROP DEFAULT; CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id"); ALTER TABLE "polls_choice" ADD CONSTRAINT "polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id" FOREIGN KEY ("question_id") REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED; COMMIT;
請注意以下幾點:
- 輸出的內容和你使用的數據庫有關,上面的輸出示例使用的是 PostgreSQL。
- 數據庫的表名是由應用名(
polls
)和模型名的小寫形式(question
和choice
)連接而來。(如果需要,你可以自定義此行為。) - 主鍵(IDs)會被自動創建。(當然,你也可以自定義。)
- 默認的,Django 會在外鍵字段名后追加字符串
"_id"
。(同樣,這也可以自定義。) - 外鍵關系由
FOREIGN KEY
生成。你不用關心DEFERRABLE
部分,它只是告訴 PostgreSQL,請在事務全都執行完之后再創建外鍵關系。 - 生成的 SQL 語句是為你所用的數據庫定制的,所以那些和數據庫有關的字段類型,比如
auto_increment
(MySQL)、serial
(PostgreSQL)和integer primary key autoincrement
(SQLite),Django 會幫你自動處理。那些和引號相關的事情 - 例如,是使用單引號還是雙引號 - 也一樣會被自動處理。 - 這個
sqlmigrate
命令並沒有真正在你的數據庫中的執行遷移 - 它只是把命令輸出到屏幕上,讓你看看 Django 認為需要執行哪些 SQL 語句。這在你想看看 Django 到底准備做什么,或者當你是數據庫管理員,需要寫腳本來批量處理數據庫時會很有用。
如果你感興趣,你也可以試試運行 python manage.py check
;這個命令幫助你檢查項目中的問題,並且在檢查過程中不會對數據庫進行任何操作。