第五章:数据库交换开发篇
一、簡要描述:
?????? Web 應用中,很多業務邏輯經常牽涉到與數據庫的交互。 數據庫驅動網站 在后臺連接數據庫服務器,從中取出一些數據,然后在 Web 頁面用漂亮的格式展示這些數據?;蛘?#xff0c;站點也提供讓訪問者自行填充數據庫的功能。
??????? 只有使用
1、簡單數據查詢
????
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})
? 這種方法可以用,但是不是最理想的方法,在Web開放中是有很多數據操作類,如果每一個類都寫數據連接,關閉那太繁瑣了。
?? 我們希望不重復同樣的代碼:創建數據庫連接、創建數據庫游標、執行某個語句、然后關閉數據庫。
?? 下介紹的內容中就可以解決這個問題,也是Django框架對Web開放的很好的支持。
MTV 開發模式
?1、MVC:了解MTV之前我們還是先復習一下MVC吧。
? Django 緊緊地遵循這種 MVC 模式,可以稱得上是一種 MVC 框架
-
M ,數據存取部分,由django數據庫層處理,本章要講述的內容。
-
V ,選擇顯示哪些數據要及怎樣顯示的部分,由視圖和模板處理。
-
C ,根據用戶輸入委派視圖的部分,由 Django 框架通過按照 URLconf 設置,對給定 URL 調用合適的 python 函數來自行處理。
?2、MTV:那到底什么是MTV呢?
??? 模型(Model)、模板(Template)和視圖(Views),Django 也被稱為 MTV 框架 。
-
M 代表模型(Model),即數據存取層。該層處理與數據相關的所有事務:如何存取、如何確認有效性、包含哪些行為以及數據之間的關系等。?
-
T 代表模板(Template),即表現層。該層處理與表現相關的決定:如何在頁面或其他類型文檔中進行顯示。
-
V 代表視圖(View),即業務邏輯層。該層包含存取模型及調取恰當模板的相關邏輯。你可以把它看作模型與模板之間的橋梁。
數據庫配置
? 1、 缺省匹配
打開項目Mysite在根目錄下可以看到“?settings.py”文件,找到DATABASES 配置如下:
DATABASES = {'default': {
'ENGINE':'', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
'NAME': '', # Or path to database file if using sqlite3.
'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
代碼描述:
?DATABASE_ENGINE 數據庫引擎設置
?
?DATABASE_NAME 將數據庫名稱告知 Django 。如果使用 SQLite,請對數據庫文件指定完整的文件系統路徑。(例如 '/home/django/mydata.db' )。
DATABASE_USER 告訴 Django 用哪個用戶連接數據庫。如果用SQLite,空白即可。
DATABASE_PASSWORD 告訴Django連接用戶的密碼。SQLite 用空密碼即可。
DATABASE_HOST 告訴 Django 連接哪一臺主機的數據庫服務器。如果數據庫與 Django 安裝于同一臺計算機(即本機),可將此項保留空白。使用 SQLite ,也可保留空白。
??
2、數據庫引擎設置
????? DATABASE_ENGINE 告訴Django使用哪個數據庫引擎
?????????????? 數據庫引擎設置
?????? 設置 ?????????????????? 數據庫 ?????? 適配器
????? postgresql ?????????? PostgreSQL??? psycopg 版本 1.x,?
http://www.djangoproject.com/r/python-pgsql/1/.
postgresql_psycopg2?? PostgreSQL ?psycopg 版本 2.x,?
http://www.djangoproject.com/r/python-pgsql/.
mysql ???????????????? MySQL ?????????? MySQLdb ,?
http://www.djangoproject.com/r/python-mysql/.
sqlite3 ??????????????? SQLite ?????????? Python 2.5+ 內建。 其他, pysqlite ,
http://www.djangoproject.com/r/python-sqlite/.
ado_mssql???????????SQL Server ??? adodbapi 版本 2.0.1+, Microsoft SQL Server
http://www.djangoproject.com/r/python-ado/.
oracle ???????????????? Oracle ??????????? cx_Oracle ,
http://www.djangoproject.com/r/python-oracle/.
?3、測試數據庫配置
?啟動了一個 Python 交互界面 : 運行 python manage.py shell 命令
?輸入下面這些命令來測試你的數據庫配置:
?
>>> from django.db import connection>>> cursor = connection.cursor()
如果沒有顯示什么錯誤信息,那么你的數據庫配置是正確的.
如果顯示錯誤則配置數據庫失敗,檢查錯誤代碼,常見錯誤:
?
錯誤信息:You havent set the DATABASE_ENGINE setting yet.
解決方案:設置正確的 DATABASE_ENGINE 配置
?
錯誤信息:Environment variable DJANGO_SETTINGS_MODULE is undefined.
解決方案:運行命令行 python manage.py shell 而不是 python .
?
錯誤信息:Error loading _____ module: No module named _____.
解決方案:你沒有安裝相關的數據庫適配器 (例如, psycopg 或 MySQLdb ).
?
錯誤信息:_____ isnt an available database backend.
解決方案:設置正確的 DATABASE_ENGINE 配置也許是拼寫錯誤?
?
錯誤信息:database _____ does not exist
解決方案:設置 DATABASE_NAME 配置到一個已有的數據庫,或者使用 CREATE DATABASE 語句
?????????????? 創建數據庫。
?
錯誤信息:role _____ does not exist
解決方案:修改 DATABASE_USER 配置到一個有效用戶
?
錯誤信息:could not connect to server
解決方案:確認 DATABASE_HOST 和 DATABASE_PORT 設置是正確的,并確認服務器是在運行
?????????????? 的。
?
第一個數據交換應用程序
?1、創建項目
? 轉到mysite項目目錄,執行命令創建books目錄
?
python manage.py startapp books?查看books文件目錄中的文件:
?
books/__init__.py
models.py
views.py
?
?2、定義數據模型
打開 models.py 并輸入下面的內容:
# -*- coding:utf-8 -*-
from django.db import models
from django.contrib import admin
class Publisher(models.Model):
name = models.CharField(max_length=30,blank=True)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province= models.CharField(max_length=30)
country=models.CharField(max_length=50)
website=models.URLField()
def __unicode__(self):
return self.name
#默認排序設置
#class Meta:
# ordering = ["name"]
#Admin 聲明標志了該類有一個管理界面'''
class Admin:
pass
class Author(models.Model):
salutation=models.CharField(max_length=10)
first_name=models.CharField(max_length=30)
last_name=models.CharField(max_length=40)
email=models.EmailField(max_length=30)
#headshot = models.ImageField(upload_to='/tmp')
def __unicode__(self):
return '%s %s' % (self.first_name, self.last_name)
#Admin 聲明標志了該類有一個管理界面'''
class Admin:
pass
class Book(models.Model):
title=models.CharField(max_length=100)
authors=models.ManyToManyField(Author)
publisher=models.ForeignKey(Publisher)
publication_date=models.DateField()
num_page =models.IntegerField(blank=True,null=True)
def __unicode__(self):
return 'Book name :%s' % self.title
模型安裝
再次編輯 settings.py 文件, 找到 INSTALLED_APPS 設置?,INSTALLED_APPS 告訴 Django 項目哪些 app 處于激活狀態,
缺省情況下如下所示:
INSTALLED_APPS = ('django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
)
把INSTALLED_APPS 設置中四個設置前面加#臨時注釋起來,
改缺省的 MIDDLEWARE_CLASSES 和 TEMPLATE_CONTEXT_PROCESSORS 設置,都注釋起來。然后添加 'mysite.books' 到 INSTALLED_APPS 列表,現在看起來是這樣:
MIDDLEWARE_CLASSES = (# 'django.middleware.common.CommonMiddleware',
# 'django.contrib.sessions.middleware.SessionMiddleware',
# 'django.contrib.auth.middleware.AuthenticationMiddleware',
# 'django.middleware.doc.XViewMiddleware',
)
TEMPLATE_CONTEXT_PROCESSORS = ()
#...
INSTALLED_APPS = (
#'django.contrib.auth',
#'django.contrib.contenttypes',
#'django.contrib.sessions',
#'django.contrib.sites',
'mysite.books',
)
?
校驗模型的有效性:
python manage.py validate0 errors found 消息:表示一切正常
否則就是錯誤,檢查數據模型是否正確。
?
生成SQL語句:
python manage.py sqlall books?運行命令的結果是這樣的:
BEGIN;CREATE TABLE "books_publisher" (
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(30) NOT NULL,
"address" varchar(50) NOT NULL,
"city" varchar(60) NOT NULL,
"state_province" varchar(30) NOT NULL,
"country" varchar(50) NOT NULL,
"website" varchar(200) NOT NULL
);
CREATE TABLE "books_book" (
"id" serial NOT NULL PRIMARY KEY,
"title" varchar(100) NOT NULL,
"publisher_id" integer NOT NULL REFERENCES "books_publisher" ("id"),
"publication_date" date NOT NULL
);
CREATE TABLE "books_author" (
"id" serial NOT NULL PRIMARY KEY,
"salutation" varchar(10) NOT NULL,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(40) NOT NULL,
"email" varchar(75) NOT NULL,
"headshot" varchar(100) NOT NULL
);
CREATE TABLE "books_book_authors" (
"id" serial NOT NULL PRIMARY KEY,
"book_id" integer NOT NULL REFERENCES "books_book" ("id"),
"author_id" integer NOT NULL REFERENCES "books_author" ("id"),
UNIQUE ("book_id", "author_id")
);
CREATE INDEX books_book_publisher_id ON "books_book" ("publisher_id");
COMMIT;
代碼描述:
???A、自動生成的表名是app名稱( books )和模型的小寫名稱( publisher , book , author )的組合
?? B、Django會站點添加一個ID主鍵,是可以修改的。
?? C 、按約定規則,Django添加的"_id"后綴到外鍵字段名。
??? D、外鍵是用 REFERENCES 語句明確定義的。
??? E、這些 CREATE TABLE 語句會根據你的數據庫而作調整,這樣象數據庫特定的一些字段例如: auto_increment (MySQL), serial (PostgreSQL), integer primary key (SQLite) 可以自動處理。
同步數據庫:
python manage.py syncdb?
你將會看到這樣的內容:
Creating table books_publisherCreating table books_book
Creating table books_author
Installing index for books.Book model
?
?
重啟服務器:
?重啟Web服務器
?
python manage.py runserver?
?
數據訪問類
??python manage.py shell 進入
?
?1、獲取所以數據
>>> from books.models import Publisher>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[<Publisher: lhj-588>, <Publisher: loker>]
2、插入數據
>>> from books.models import Publisher>>>p = Publisher(name='Apress',
... address='2855 Telegraph Ave.',
... city='Berkeley',
... state_province='CA',
... country='U.S.A.',
... website='http://www.apress.com/')
>>> p.save()
轉換成SQL:
INSERT INTO book_publisher(name, address, city, state_province, country, website)
VALUES
('Apress', '2855 Telegraph Ave.', 'Berkeley', 'CA',
'U.S.A.', 'http://www.apress.com/');
?
3、修改數據
>>> from books.models import Publisher>>>p = Publisher(name='Apress'
,... address='2855 Telegraph Ave.'
,... city='Berkeley'
,... state_province='CA'
,... country='U.S.A.'
,... website='http://www.apress.com/')
>>> p.save()
>>> p.id
3
>>> p.name ='apress Publishing'
>>> p.save()
?后面執行的 save() 相當于下面的SQL語句:
name = 'Apress Publishing',
address = '2855 Telegraph Ave.',
city = 'Berkeley',
state_province = 'CA',
country = 'U.S.A.',
website = 'http://www.apress.com'
WHERE id = 52;
4、過濾數據??filter()
>>> from books.models import Publisher>>>Publisher.objects.filter(country="U.S.A.", state_province="CA")
[<Publisher: Apress Publishing>]
相當于SQL語句:
SELECTid, name, address, city, state_province, country, website
FROM book_publisher
WHERE country = 'U.S.A.' AND state_province = 'CA';
?
5、獲取單個對象
>>> from books.models import Publisher>>>Publisher.objects.get(name="Apress Publishing") [<Publisher: Apress Publishing>]
如果查詢出多個對象,則會導致拋出異常。
6、數據排序 order_by
>>> from books.models import Publisher>>>Publisher.objects.order_by("name") [<Publisher: Apress Publishing>, <Publisher: Addison-Wesley>, <Publisher: O'Reilly>]
相當于SQL:
SELECTid, name, address, city, state_province, country, website
FROM book_publisher
ORDER BY name;
可以指定逆向排序
Publisher.objects.order_by("-name") ? 7、限制返回的數據 ? >>>from books.models import Publisher>>>Publisher.objects.all()[0]
<Publisher: Addison-Wesley>
>>>Publisher.objects.all()[0:2]
[<Publisher: Addison-Wesley>, <Publisher: Apress Publishing>, <Publisher: Addison-Wesley>] 8、刪除對象.delete() >>>from books.models import Publisher
>>>p = Publisher.objects.get(name="Addison-Wesley")
>>> p.delete()
>>> Publisher.objects.all()
[<Publisher: Apress Publishing>, <Publisher: O'Reilly>]
>>>publishers.delete()
>>> Publisher.objects.all()
[]
?
?
?
修改數據庫表結構
你需要查看 manage.py sqlall 的執行結果?
同用步驟:
A、修改數據模型
B、同步數據庫:執行python manage.py syncdb
C、重啟服務器:執行python manage.py runserver
先修改在開發環境而不是發布服務器上修改
1、添加字段
在開發環境中執行下面的步驟:
把這個字段添加到你的模型中.
運行 manage.py sqlall [yourapp] 會看到模型的新的 CREATE TABLE 語句。注意新的字段的列定義。
啟動您的數據庫交互shell(也就是 psql 或 mysql , 或者您也可以使用 manage.py dbshell )。 執行一個 ALTER TABLE 語句,添加您的新列
??? 4. (可選)用 manage.py shell 動ython交互式shell,并通過引入模型并選擇表驗證新的字段已被正確添加(比如, MyModel.objects.all()[:5] )。
然后在發布服務器上執行下面的步驟:?
啟動你的數據庫的交互式命令行;
執行 ALTER TABLE 語句,也就是在開發環境中第3步執行的語句;
添加字段到你的模型中。如果你在開發時使用了版本控制系統并checkin了你的修改,現在可以更新代碼到發布服務器上了(例如,使用Subverison的話就是 svn update )。
重啟Web服務器以使代碼修改生效
2、刪除字段
從模型里刪除一個字段可要比增加它簡單多了。刪除一個字段僅需要做如下操作:
從你的模型里刪除這個字段,并重啟Web服務器。
使用如下面所示的命令,從你的數據庫中刪掉該列:
3、刪除 Many-to-Many 字段
?
因為many-to-many字段同普通字段有些不同,它的刪除過程也不一樣:
刪除掉你的模型里的 ManyToManyField ,并且重啟Web服務器。
使用如下面所示的命令,刪除掉你數據庫里的many-to-many表:
DROP TABLE books_books_publishers;4、刪除模型
?
完全刪除一個模型就像刪除一個字段一樣簡單。刪除模型僅需要做如下步驟:
將此模型從你的 models.py 文件里刪除,并且重啟Web服務器。
使用如下的命令,將此表從你的數據庫中刪除:
DROP TABLE books_book;
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的第五章:数据库交换开发篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女神降临 电视剧(说一说女神降临 电视剧
- 下一篇: bash算数运算