W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Django 可以:
CREATE TABLE
? 語句)。Question
和 ?Choice
?對象進(jìn)行交互的 Python 數(shù)據(jù)庫 API。但是首先得把 ?polls
?應(yīng)用安裝到我們的項目里。
為了在我們的工程中包含這個應(yīng)用,我們需要在配置類 ?INSTALLED_APPS
?中添加設(shè)置。因為 ?PollsConfig
類寫在文件 ?polls/apps.py
? 中,所以它的點(diǎn)式路徑是 ?'polls.apps.PollsConfig'
?。在文件 ?mysite/settings.py
? 中 ?INSTALLED_APPS
? 子項添加點(diǎn)式路徑后,它看起來像這樣:
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
現(xiàn)在你的 Django 項目會包含 ?polls
應(yīng)用。接著運(yùn)行下面的命令:
...\> py manage.py makemigrations polls
你將會看到類似于下面這樣的輸出:
Migrations for 'polls':
polls/migrations/0001_initial.py
- Create model Question
- Create model Choice
通過運(yùn)行 ?makemigrations
命令,Django 會檢測你對模型文件的修改(在這種情況下,你已經(jīng)取得了新的),并且把修改的部分儲存為一次 遷移。
遷移是 Django 對于模型定義(也就是你的數(shù)據(jù)庫結(jié)構(gòu))的變化的儲存形式 - 它們其實(shí)也只是一些你磁盤上的文件。如果你想的話,你可以閱讀一下你模型的遷移數(shù)據(jù),它被儲存在 ?polls/migrations/0001_initial.py
? 里。別擔(dān)心,你不需要每次都閱讀遷移文件,但是它們被設(shè)計成人類可讀的形式,這是為了便于你手動調(diào)整 Django 的修改方式。
Django 有一個自動執(zhí)行數(shù)據(jù)庫遷移并同步管理你的數(shù)據(jù)庫結(jié)構(gòu)的命令 - 這個命令是 ?migrate
?,我們馬上就會接觸它 - 但是首先,讓我們看看遷移命令會執(zhí)行哪些 SQL 語句。?sqlmigrate
?命令接收一個遷移的名稱,然后返回對應(yīng)的 SQL:
...\> py manage.py sqlmigrate polls 0001
你將會看到類似下面這樣的輸出:
BEGIN;
--
-- 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
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
"id" serial NOT NULL PRIMARY KEY,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL,
"question_id" integer NOT NULL
);
ALTER TABLE "polls_choice"
ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"
FOREIGN KEY ("question_id")
REFERENCES "polls_question" ("id")
DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;
請注意以下幾點(diǎn):
polls
?)和模型名的小寫形式( ?question
?和 ?choice
?)連接而來。(如果需要,你可以自定義此行為。)"_id"
? 。(同樣,這也可以自定義。)FOREIGN KEY
? 生成。你不用關(guān)心 ?DEFERRABLE
部分,它只是告訴 PostgreSQL,請在事務(wù)全都執(zhí)行完之后再創(chuàng)建外鍵關(guān)系。auto_increment
(MySQL)、 ?serial
?(PostgreSQL)和 ?integer primary key autoincrement
? (SQLite),Django 會幫你自動處理。那些和引號相關(guān)的事情 - 例如,是使用單引號還是雙引號 - 也一樣會被自動處理。sqlmigrate
?命令并沒有真正在你的數(shù)據(jù)庫中的執(zhí)行遷移 - 相反,它只是把命令輸出到屏幕上,讓你看看 Django 認(rèn)為需要執(zhí)行哪些 SQL 語句。這在你想看看 Django 到底準(zhǔn)備做什么,或者當(dāng)你是數(shù)據(jù)庫管理員,需要寫腳本來批量處理數(shù)據(jù)庫時會很有用。現(xiàn)在,再次運(yùn)行 ?migrate
?命令,在數(shù)據(jù)庫里創(chuàng)建新定義的模型的數(shù)據(jù)表:
...\> py manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Rendering model states... DONE
Applying polls.0001_initial... OK
這個 ?migrate
命令選中所有還沒有執(zhí)行過的遷移(Django 通過在數(shù)據(jù)庫中創(chuàng)建一個特殊的表 ?django_migrations
? 來跟蹤執(zhí)行過哪些遷移)并應(yīng)用在數(shù)據(jù)庫上 - 也就是將你對模型的更改同步到數(shù)據(jù)庫結(jié)構(gòu)上。
遷移是非常強(qiáng)大的功能,它能讓你在開發(fā)過程中持續(xù)的改變數(shù)據(jù)庫結(jié)構(gòu)而不需要重新刪除和創(chuàng)建表 - 它專注于使數(shù)據(jù)庫平滑升級而不會丟失數(shù)據(jù)。我們會在后面的教程中更加深入的學(xué)習(xí)這部分內(nèi)容,現(xiàn)在,你只需要記住,改變模型需要這三步:
編輯 ?models.py
? 文件,改變模型。
運(yùn)行 ?python manage.py makemigrations
? 為模型的改變生成遷移文件。
運(yùn)行 ?python manage.py migrate
? 來應(yīng)用數(shù)據(jù)庫遷移。
數(shù)據(jù)庫遷移被分解成生成和應(yīng)用兩個命令是為了讓你能夠在代碼控制系統(tǒng)上提交遷移數(shù)據(jù)并使其能在多個應(yīng)用里使用;這不僅僅會讓開發(fā)更加簡單,也給別的開發(fā)者和生產(chǎn)環(huán)境中的使用帶來方便。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: