天天看點

python 簡單資料庫設計執行個體_Django連接配接MySQL資料庫的簡單例子

前面一小節我們介紹了用 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應用程式來盡可能讓更多人使用的話,這個特性是非常适當的。)

這些都是存在的問題,後面我們會介紹如何解決這些問題。