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