django學習-數據庫配置-建立模型

 數據庫配置python

在mysite/settings.py中,包含了django項目設置的python模塊mysql

 

一般,這個配置文件使用SQLite做爲默認數據庫。若是你不熟悉數據庫,或者只是想嘗試下django,這是最簡單的選擇。python內置SQLite,因此你無需安裝額外東西來使用它。當你開始一個真正的項目時,你可能更傾向使用一個更具擴展性的數據庫,例如PostgreSQL,避免中途切換數據庫這個使人頭疼的問題。web

 

若是想使用其餘數據庫,須要安裝合適的database bindlings,而後改變設置文件中DATABASE ‘default’項目中的一些鍵值:sql

例如:數據庫

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

 

  

DATABASE ‘default’項目中一些鍵值
ENGINE—數據庫類型可選值:
'django.db.backends.sqlite3'
'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.oracle'

 

NAME-數據庫的名稱

若是使用的是SQLite,數據庫將是你電腦上的一個文件,在這種狀況下,NAME應該是此文件的絕對路徑,包括文件名。默認值os.path.join(BASE_DIR, ‘db.sqlite3’)將會把數據庫文件儲存在項目的根目錄。django

 

若是你是不使用SQLite,則必須添加一些額外設置,好比USER、PASSWORD、HOST等等。session

 

如:數據結構

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

 

SQLite之外的其餘數據庫

若是使用了SQLite之外的數據庫,請確認在使用前已經建立了數據庫。你能夠經過在你的數據庫交互命令行中使用」CREATE DATABASE database_name;」命令來完成這件事。oracle

 

另外,還要確保該數據庫用戶提供操做mysite/settings.py具備」create database」權限。這使得自動建立的test database能被之後的教程使用。app

 

若是你使用SQLite,name你不須要在使用前作任何事—數據庫會在須要的時候自動建立。

 

編輯mysite/settings.py文件前,先設置TIME_ZONE爲你本身時區。

 

此外,關注一下文件頭部的INSTALLED_APPS設置項。這裏包含了會在你項目中啓用的全部django應用。應用能在多個項目中使用,你也能夠打包而且發佈應用,讓別人使用它們。

例如:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

 

INSTALLED_APPS

一般,INSTALLED_APPS默認包括瞭如下django的自帶應用:

 

django.contrib.admin- 管理員站點

django.contrib.auth-認證受權系統

django.contrib.contenttypes-內容類型框架

django.contrib.sessions-會話框架

django.contrib.messages—消息框架

django.contrib.staticfiles-管理靜態文件的框架

 

這些應用被默認啓用是爲了給常規項目提供方便。

默認開啓的某些應用須要至少一個數據表,因此,在使用他們以前須要在數據庫中建立一些表。

py -3 manage.py migrate數據庫遷移命令

這個migrate命令檢查INSTALLED_APPS設置,爲其中的每一個應用建立須要的數據表,至於具體會建立什麼,這取決於你的mysite/settings.py設置文件和每一個應用的數據庫遷移文件。這個命令所執行的每一個遷移操做都會在終端中顯示出來。

 

能夠運行show tables;查看django具體建立哪些表:

 

 

django默認激活了一些應用,但並非每一個人都須要他們。若是咱們不須要某個或某些應用,能夠在運行migrate前從INSTALLED_APPS裏註釋或刪掉他們。

migrate命令只會爲在INSTALLED_APPS裏聲明瞭的應用進行數據庫遷移。

 

建立模型

在django裏寫一個數據庫驅動的web應用的第一步是定義模型-也就是數據庫結構設計和附加的其餘元數據。

 

模型是真實數據的簡單明確的描述。它包含了儲存的數據所必要的字段和行爲。django遵循DRY Principle(不重複造輪子)。它的目標是你只須要定義數據模型,而後其餘的雜七雜八的代碼你都不用關心,他們會自動從模型生成。

 

來介紹一下遷移-舉個例子,django的遷移代碼是由你的模型文件自動生成的,它本質上只是個歷史記錄,django能夠用它來進行數據庫的滾動更新,經過這種方式使其可以和當前的模型匹配。

 

在這個簡單的投票應用中,須要建立兩個模型:問題Question和選項Choice。Question模型包括問題描述和發佈時間。Choice模型有兩個字段,選項描述和當前得票數。每一個選項屬於一個問題。

 

這些概念能夠經過一個簡單的python類來描述。按照下面的例子來編輯polls/models.py文件:

 

from django.db import models

# Create your models here.

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

代碼很是直白,每一個模型被表示爲django.db.models.Model類的子類。每一個模型有一些類變量,他們都表示模型裏的一個數據庫字段。

 

每一個字段都是Field類的實例-好比,字符字段被表示爲CharField,日期時間被表示爲DateTimeField。這將高速django每一個字段要處理的數據類型。

 

每一個Field類實例變量的名稱(例如question_text或pub_date)也是字段名,因此最好使用對機器友好的格式。你將會在pythob代碼裏使用他們,而數據庫會將它做爲列名。

 

你可使用可選的選項來爲Field定義一我的類可讀的名字。這個功能在不少django內部組成部分中都被使用了,並且做爲文檔的一部分。若是某個字段沒有提供此名稱,django將會使用對機器友好的名稱,也就是變量名。

在上面的例子中,咱們只爲Question.pub_date定義了對人類友好的名字。對於模型內的其餘字段,他們的機器友好名也會被做爲人類友好名使用。

 

定義某些Field類實例須要參數。例如CharField須要一個max_length參數。這個參數的用處不至於用來定義數據庫結構,也用於驗證數據,咱們稍後會看到這方面的內容。

 

Field也可以接收多個可選參數;在上面的例子中:咱們將votes的default也就是默認值,設爲0。

 

注意在最後,咱們使用ForeighKey定義了一個關係。這將高速django,每一個Choice對象都關聯到一個Question對象。django支持全部經常使用的數據庫關係:多對1、多對多和一對一。

 

 

激活模型

上面的一小隊用於建立模型的代碼給了django不少信息,經過這些信息,django能夠作一下事情:

1)爲這個應用建立數據庫schema(生成CREATE TABLE語句)

2)建立能夠與Question和Choice對象進行交互的python數據庫API

 

可是首先得把polls應用安裝到咱們的項目裏

 

設計哲學:

django應用是」可插拔」的。你能夠在多個項目中使用同一個應用。除此以外,你還能夠發佈本身的應用,由於他們並不會綁定到當前安裝的django上。

 

爲了在咱們的工程中包含這個應用,咱們須要在配置類INSTALLED_APPS中添加設置。由於PollsConfig類寫在文件polls/app.py中,因此它的點式路徑是’polls.apps.PollsConfig’。在文件mysite/settings.py中INSTALLED_APP子項添加點式路徑後,它看起來像這樣:

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

 

如今你的django項目會包含polls應用。接着運行下面的命令:

py -3 manage.py makemigrations polls生成遷移

 

你將會看到相似於下面這樣的輸出:

 

經過運行makemigrations命令,django會檢測你對模型文件的修改(在這種狀況下,你已經取得的新的),而且把修改的部分儲存爲一次遷移。

 

遷移是django對於模型定義(也就是你的數據庫結構)的變化的儲存形式-沒那麼玄乎,它們其實也只是一些你磁盤上的文件,能夠閱讀模型的遷移數據,在polls/migrations/0001_initial.py裏。以下圖:

 

 

 

django有一個自動執行數據遷移並同步管理你的數據庫結果的命令-這個命令是migrate,咱們立刻會接觸它。

可是首先,讓咱們看看遷移命令會執行哪些sql語句。

sqlmigrate命令接收一個遷移的名稱,而後返回對應的SQL:
py -3 manage.py sqlmigrate polls 0001

你將會看到相似下面的輸出(把輸出重組成了人類可讀的格式):

D:\django\mysite>py -3 manage.py sqlmigrate polls 0001

BEGIN;

--

-- Create model Question

--

CREATE TABLE `polls_question` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `question_text` varchar(200) NOT NULL, `pub_date` datetime(6) NOT NULL);

--

-- Create model Choice

--

CREATE TABLE `polls_choice` (`id` integer AUTO_INCREMENT 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`);

COMMIT;

 

 

請注意如下幾點:

1)輸出的內容和你使用的數據庫有關,上面的輸出實例使用的mysql

2)數據庫的表名是由應用名(polls)和模型名的小寫形式(question和choice)鏈接而來。(若是須要,你能夠自定義此行爲。)

3)主鍵(IDs)會被自動建立。(固然,你也能夠自定義)

4)默認的,django會在外鍵字段名後追加字符串」_id」。(一樣,也能夠自定義。)

5)外鍵關係有FOREIGN KEY生成。你不用關心DEFERRABLE部分(針對PostgreSQL),它是指告訴PostgreSQL,請在事務全都執行完以後再建立外鍵關係。

6)生成的SQL語句是爲你所用的數據庫定製的,因此那些和數據庫有關的字段類型,好比auto_increment(MySQL)、serial(PostgreSQL)和integer primary key autoincrement(SQLite),django會幫你自動處理。那些和引號相關的事情-例如,是使用單引號仍是雙引號-也同樣會被自動處理。

7)這個sqlmigrate命令並無真正在你的數據庫中執行遷移-它只是把命令輸出到屏幕上,讓你看看django認爲須要執行哪些sql語句。這在你想看看django到底準備作什麼,或者當你是數據庫管理員,須要寫腳原本批量處理數據庫時會頗有用。

 

py -3 manage.py check檢查項目

能夠運行py -3 manage.py check命令來幫助你檢查項目中的問題,而且在檢查過程當中不會對數據庫進行任何操做

 

運行migrate命令,在數據庫裏建立新定義的模型的數據表:

 

D:\django\mysite>py -3 manage.py migrate

Operations to perform:

  Apply all migrations: admin, auth, contenttypes, polls, sessions

Running migrations:

  Applying polls.0001_initial... OK

 

這個migrate命令選中全部尚未執行過的遷移(django經過在數據庫中建立一個特殊的表django_migrations來跟蹤執行過哪些遷移)並應用在數據庫上-也就是將你對模型的更改同步到數據庫結構上。

 

遷移是很是大的功能,它能讓你在開發過程當中持續的改變數據結構而不須要從新刪除和建立表-它專一因而數據庫平滑升級而不會丟失數據。咱們會在後面的教程中更加深刻的學習這部份內容,如今,你只要記住,改變模型須要如下三步:

 

改變模型的步驟

1)編輯models.py文件,改變模型。

2)運行python manage.py makemigrations爲模型的改變生成遷移文件

3)運行python manage.py migrate來應用數據庫遷移

 

數據庫遷移被分解成生成和應用兩個命令是爲了讓你可以在代碼控制系統上提交遷移數據並使其能在多個應用裏使用;這不只僅會讓開發更加簡單,也給別的開發者和生產環境中的使用帶來方便。

相關文章
相關標籤/搜索