Django在檢視中進行資料庫查詢的笨方法
在檢視中也有笨方法可以從資料庫中獲取資料。 很簡單: 用現有的任何 Python 類庫執行一條 SQL 查詢並對結果進行一些處理。
from django.shortcuts import render_to_response import MySQLdb def book_list(request): db = MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost') cursor = db.cursor() cursor.execute('SELECT name FROM books ORDER BY name') names = [row[0] for row in cursor.fetchall()] db.close() return render_to_response('book_list.html', {'names': names})
這個方法可用,但很快一些問題將出現在你面前:
-
我們將資料庫連線引數硬行編碼於程式碼之中。 理想情況下,這些引數應當儲存在 Django 配置中。
-
我們不得不重複同樣的程式碼: 建立資料庫連線、建立資料庫遊標、執行某個語句、然後關閉資料庫。 理想情況下,我們所需要應該只是指定所需的結果。
-
它把我們栓死在 MySQL 之上。 如果過段時間,我們要從 MySQL 換到 PostgreSQL,就不得不使用不同的資料庫介面卡(例如 psycopg 而不是 MySQLdb ),改變連線引數,根據 SQL 語句的型別可能還要修改SQL 。 理想情況下,應對所使用的資料庫伺服器進行抽象,這樣一來只在一處修改即可變換資料庫伺服器。 (如果你正在建立一個開源的Django應用程式來儘可能讓更多人使用的話,這個特性是非常適當的。)
正如你所期待的,Django資料庫層正是致力於解決這些問題。 以下提前揭示瞭如何使用 Django 資料庫 API 重寫之前那個檢視。
from django.shortcuts import render_to_response
from mysite.books.models import Book
def book_list(request):
books = Book.objects.order_by('name')
return render_to_response('book_list.html', {'books': books})