被解放的姜戈02 庄園疑雲


作者: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使用類和對象接口,來操縱底層的數據庫。

有了數據庫,就有了站點內容的大本營。

 

姜戈,風雨欲來。

 

歡迎閱讀“被解放的姜戈”系列文章。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM