作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!
上一回說到,姜戈的江湖初體驗:如何架設服務器,如何回復http請求,如何創建App。這一回,我們要走入糖果庄園。
數據庫是一所大庄園,藏着各種寶貝。一個沒有數據庫的網站,所能提供的功能會非常有限。
為了找到心愛的人,姜戈決定一探這神秘的糖果庄園。
連接數據庫
Django為多種數據庫后台提供了統一的調用API。根據需求不同,Django可以選擇不同的數據庫后台。MySQL算是最常用的數據庫。我們這里將Django和MySQL連接。
在Linux終端下啟動mysql:
$mysql -u root -p
在MySQL中創立Django項目的數據庫:
mysql> CREATE DATABASE villa DEFAULT CHARSET=utf8;
這里使用utf8作為默認字符集,以便支持中文。
在MySQL中為Django項目創立用戶,並授予相關權限:
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON villa.* TO 'vamei'@'localhost' IDENTIFIED BY 'vameiisgood';
在settings.py中,將DATABASES對象更改為:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'villa',
'USER': 'vamei',
'PASSWORD': 'vameiisgood',
'HOST':'localhost',
'PORT':'3306',
}
}
后台類型為mysql。上面包含數據庫名稱和用戶的信息,它們與MySQL中對應數據庫和用戶的設置相同。Django根據這一設置,與MySQL中相應的數據庫和用戶連接起來。此后,Django就可以在數據庫中讀寫了。
姜戈略一遲疑,旋即走入了庄園的大門。
創立模型
MySQL是關系型數據庫。但在Django的幫助下,我們不用直接編寫SQL語句。Django將關系型的表(table)轉換成為一個類(class)。而每個記錄(record)是該類下的一個對象(object)。我們可以使用基於對象的方法,來操縱關系型的MySQL數據庫。
在傳統的MySQL中,數據模型是表。在Django下,一個表為一個類。表的每一列是該類的一個屬性。在models.py中,我們創建一個只有一列的表,即只有一個屬性的類:
from django.db import models class Character(models.Model): name = models.CharField(max_length=200) def __unicode__(self): return self.name
類Character定義了數據模型,它需要繼承自models.Model。在MySQL中,這個類實際上是一個表。表只有一列,為name。可以看到,name屬性是字符類型,最大長度為200。
類Character有一個__unicode__()方法,用來說明對象的字符表達方式。如果是Python 3,定義__str__()方法,實現相同的功能。
命令Django同步數據庫。Django根據models.py中描述的數據模型,在MySQL中真正的創建各個關系表:
$python manage.py syncdb
同步數據庫后,Django將建立相關的MySQL表格,並要求你創建一個超級用戶:
Creating tables ...
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table west_character
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'tommy'): vamei
Email address: vamei@vamei.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
數據模型建立了。打開MySQL命令行:
$mysql -u vamei -p
查看數據模型:
USE villa; SHOW TABLES; SHOW COLUMNS FROM west_character;
最后一個命令返回Character類的對應表格:
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(200) | NO | | NULL | |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
可以看到,Django還自動增加了一個id列,作為記錄的主鍵(Primary Key)。
這富麗堂皇的別墅中,姜戈隱隱聞到凶險的味道。
顯示數據
數據模型雖然建立了,但還沒有數據輸入。為了簡便,我們手動添加記錄。打開MySQL命令行,並切換到相應數據庫。添加記錄:
INSERT INTO west_character (name) Values ('Vamei'); INSERT INTO west_character (name) Values ('Django'); INSERT INTO west_character (name) Values ('John');
查看記錄:
SELECT * FROM west_character;
可以看到,三個名字已經錄入數據庫。
下面我們從數據庫中取出數據,並返回給http請求。在west/views.py中,添加視圖。對於對應的請求,我們將從數據庫中讀取所有的記錄,然后返回給客戶端:
# -*- coding: utf-8 -*-
from django.http import HttpResponse from west.models import Character def staff(request): staff_list = Character.objects.all() staff_str = map(str, staff_list) return HttpResponse("<p>" + ' '.join(staff_str) + "</p>")
可以看到,我們從west.models中引入了Character類。通過操作該類,我們可以讀取表格中的記錄
為了讓http請求能找到上面的程序,在west/urls.py增加url導航:
from django.conf.urls import patterns, include, url urlpatterns = patterns('', url(r'^staff/','west.views.staff'), )
運行服務器。在瀏覽器中輸入URL:
127.0.0.1:8000/west/staff
查看效果:
從數據庫讀出數據,顯示在頁面
“我心愛的人,原來你在這里。” 姜戈強自鎮定,嘴角忍不住顫動。
總結
Django使用類和對象接口,來操縱底層的數據庫。
有了數據庫,就有了站點內容的大本營。
姜戈,風雨欲來。
歡迎閱讀“被解放的姜戈”系列文章。