前面一小節我們介紹了用 Django 建造網站的基本途徑: 建立視圖和 URLConf。視圖負責處理一些主觀邏輯,然後傳回響應結果。
但是這樣的功能是遠遠不夠的。大部分 Web 應用需要主觀邏輯經常牽涉到與資料庫的互動。資料庫驅動網站在背景連接配接資料庫伺服器,從中取出一些資料,然後在 Web 頁面用漂亮的格式展示這些資料。這個網站也可能會向通路者提供修改資料庫資料的方法。
由于先天具備 Python 簡單而強大的資料庫查詢執行方法,Django 非常适合開發資料庫驅動網站。
在視圖中進行資料庫查詢的笨方法
先上一個例子:
前面我們在視圖中輸出 HTML 的笨方法(通過在視圖裡對文本直接寫死HTML),在視圖中也有笨方法可以從資料庫中擷取資料。很簡單: 用現有的任何 Python 類庫執行一條 SQL 查詢并對結果進行一些處理。
在本例的視圖中,我們使用了 MySQLdb 類庫來連接配接 MySQL 資料庫,取回一些記錄,将它們提供給模闆以顯示一個網頁:
from django.shortcuts import render_to_response
import MySQLdb
def book_list(request):
db = MySQLdb.connect(user='root', db='nowamagic', passwd='', host='localhost')
cursor = db.cursor()
cursor.execute('SELECT title FROM chika ORDER BY id')
names = [row[0] for row in cursor.fetchall()]
db.close()
return render_to_response('list.html', {'names': names})
然後修改下 urls.py:
#from django.conf.urls import patterns, include, url
from django.conf.urls.defaults import *
from django.views.static import *
from django.conf import settings
from PythonProject.views import book_list
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
#url(r'^$', 'PythonProject.views.home', name='home'),
#url(r'^PythonProject/', include('PythonProject.foo.urls')),
# Uncomment the admin/doc line below to enable admin documentation:
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
('^book_list/$', book_list),
)
再簡單設計一下模闆檔案 list.html:
簡明現代魔法 {{names}}
現在我們通路 http://127.0.0.1:8000/book_list/,程式輸出:
['chika']
如果你要測試,可以自己先建立一個測試用的資料表。
點評
這個方法雖然可用,但很快一些問題将出現在你面前:
我們将資料庫連接配接參數硬行編碼于代碼之中。 理想情況下,這些參數應當儲存在 Django 配置中。
我們不得不重複同樣的代碼: 建立資料庫連接配接、建立資料庫遊标、執行某個語句、然後關閉資料庫。 理想情況下,我們所需要應該隻是指定所需的結果。
它把我們栓死在 MySQL 之上。 如果過段時間,我們要從 MySQL 換到 PostgreSQL,就不得不使用不同的資料庫擴充卡(例如 psycopg 而不是 MySQLdb ),改變連接配接參數,根據 SQL 語句的類型可能還要修改SQL 。 理想情況下,應對所使用的資料庫伺服器進行抽象,這樣一來隻在一處修改即可變換資料庫伺服器。 (如果你正在建立一個開源的Django應用程式來盡可能讓更多人使用的話,這個特性是非常适當的。)
這些都是存在的問題,後面我們會介紹如何解決這些問題。