如果你想用做個(gè)網(wǎng)站。你一想算吩,一個(gè)網(wǎng)站要包含成千上萬(wàn)條信息留凭,而且需要時(shí)常更新,并且當(dāng)網(wǎng)站運(yùn)行中斷偎巢、重啟之后還得保存之前的信息狀態(tài)蔼夜。這個(gè)時(shí)候你要怎么辦?
直接在代碼中定義肯定不行了压昼,不過(guò)你可以將信息轉(zhuǎn)成文本或通過(guò)“序列化”方式保存在文件中求冷,但數(shù)據(jù)量變大就很復(fù)雜且耗時(shí)。其實(shí)呀窍霞,一個(gè)數(shù)據(jù)庫(kù)就可以來(lái)解決你的問(wèn)題匠题。它便于保存程序和讀取數(shù)據(jù),還能直接通過(guò)條件快速查詢(xún)到指定數(shù)據(jù)但金。
經(jīng)過(guò)網(wǎng)狀數(shù)據(jù)庫(kù)到層次數(shù)據(jù)庫(kù)再到關(guān)系數(shù)據(jù)庫(kù)的發(fā)展韭山,數(shù)據(jù)庫(kù)家族已經(jīng)越來(lái)越壯大了,大概可以分為兩類(lèi):
①付費(fèi)的商用數(shù)據(jù)庫(kù):oracle冷溃、SQL钱磅、Server(微軟),DB2(IBM的產(chǎn)品)似枕、Sybase等盖淡;②免費(fèi)的開(kāi)源數(shù)據(jù)庫(kù):MySQL、PostgreSQL菠净、SQLite等禁舷。
常見(jiàn)的數(shù)據(jù)庫(kù)有 MySQL、Oracle毅往、SQL Server牵咙、DB2、ACCESS 等等攀唯,雖然種類(lèi)繁多洁桌,但其原理大都是相通的。接下來(lái)主要講講SQLite和MySQL侯嘀。
【一】SQLite
SQLite是一種嵌入式數(shù)據(jù)庫(kù)另凌,是由C寫(xiě)的體積很小的文件谱轨。Linux 和較新版的 Mac 系統(tǒng)都默認(rèn)裝有 SQLite,Windows 下的安裝也不復(fù)雜吠谢,另外Python(2.7.x)內(nèi)置了SQLite3土童,在Python中使用SQLite,不需要安裝任何東西工坊,便直接使用献汗,以SQLite3為例:
所以對(duì)于入門(mén)數(shù)據(jù)庫(kù),或者做一些小項(xiàng)目來(lái)說(shuō)王污,SQLite 是個(gè)不錯(cuò)的選擇罢吃。
我現(xiàn)在將創(chuàng)建一個(gè)叫做 MovieSite.db 的數(shù)據(jù)庫(kù),用來(lái)作為電影網(wǎng)站的數(shù)據(jù)存儲(chǔ)昭齐。在命令行下輸入:
sqlite3 MovieSite.db
如果你系統(tǒng)里的 sqlite 已正常安裝尿招,將會(huì)看到提示符變成
sqlite>
這表示你已進(jìn)入 sqlite 的控制臺(tái)。注意阱驾,你運(yùn)行 sqlite3 時(shí)所在的目錄將會(huì)決定你創(chuàng)建的數(shù)據(jù)庫(kù)文件所在位置就谜,文件名就是你定的數(shù)據(jù)庫(kù)名。你需要至少創(chuàng)建一張表啊易,這個(gè)數(shù)據(jù)庫(kù)才會(huì)被創(chuàng)建并保存吁伺。
表就是數(shù)據(jù)庫(kù)中存放關(guān)系數(shù)據(jù)的集合,一個(gè)數(shù)據(jù)庫(kù)里面有多個(gè)表租谈,表與表之間用外鍵關(guān)聯(lián)篮奄。
在 SQLite 的控制臺(tái)下輸入:
create table movie (title, year, country, abstract);
這條命令將建立一張叫做 movie 的表,表的結(jié)構(gòu)是 4 列屬性割去,分別用來(lái)記錄電影的標(biāo)題窟却、年份、國(guó)家呻逆、簡(jiǎn)介夸赫。
再通過(guò)命令向剛剛建立的表里添加一些數(shù)據(jù):
insert into movie values ('阿甘正傳', 1994, '美國(guó)', 'Life is like a box of chocolates.');
insert into movie values ('肖申克的救贖', 1994, '美國(guó)', 'Hope is a good thing.');
類(lèi)似 create table、insert into 這類(lèi)以 ; 結(jié)尾的命令被稱(chēng)作 SQL 語(yǔ)句咖城,它們是數(shù)據(jù)庫(kù)的通用操作茬腿。通過(guò)它們你可以創(chuàng)建表、增刪改查數(shù)據(jù)等等宜雀。在輸入的時(shí)候切平,務(wù)必注意要使用英文半角符號(hào)。
而 SQLite 還提供了一些操作:
輸入.help可以查看這些命令辐董。注意這些命令前面都有一個(gè)英文點(diǎn)號(hào)悴品。
.databases 查看當(dāng)前的數(shù)據(jù)庫(kù)列表,
.tables 查看當(dāng)前的表,
.quit 退出控制臺(tái)苔严。
現(xiàn)在定枷,你可以輸入查詢(xún)語(yǔ)句查看剛剛添加到 movie 表中的所有數(shù)據(jù):
select * from movie;
確認(rèn)數(shù)據(jù)庫(kù)的表中已經(jīng)有了我們想要的數(shù)據(jù)之后,接下來(lái)要解決的就是如何從網(wǎng)站程序中調(diào)用這些數(shù)據(jù)届氢。
web.py 連接 SQLite 很簡(jiǎn)單欠窒,只需要一行語(yǔ)句:
db = web.database(dbn='sqlite', db='MovieSite.db')
現(xiàn)在可以把先前程序中定義的 movies 變量給去掉了,然后將 GET 方法修改為:
def GET(self):
movies = db.select('movie')
return render.index(movies)
同之前一樣悼沈,刷新網(wǎng)頁(yè)贱迟,你將看到和上次一樣的頁(yè)面。只不過(guò)現(xiàn)在的數(shù)據(jù)來(lái)源于 SQLite 的數(shù)據(jù)庫(kù)中絮供。
修改一下模板,加上兩項(xiàng)新屬性茶敏,讓頁(yè)面顯示更多信息:
$movie['country'], $movie['abstract']
為了讓創(chuàng)建數(shù)據(jù)庫(kù)的過(guò)程更加方便壤靶,通常會(huì)將之前我們使用的 SQL 語(yǔ)句寫(xiě)在一個(gè)文件里。比如惊搏,創(chuàng)建一個(gè) tables.sql 的文件贮乳,在里面寫(xiě)上:
create table movie (title, year, country, abstract);
insert into movie values ('阿甘正傳', 1994, '美國(guó)', 'Life is like a box of chocolates.');
insert into movie values ('肖申克的救贖', 1994, '美國(guó)', 'Hope is a good thing.');
然后在 SQLite 控制臺(tái)下輸入命令:
.read tables.sql
就可以一次性完成之前的建表和添加數(shù)據(jù)的操作。因此恬惯,當(dāng)下次想要修改數(shù)據(jù)庫(kù)的時(shí)候向拆,一種簡(jiǎn)單粗暴的方法就是,刪除 MovieSite.db 文件酪耳,修改 tables.sql 里的建表語(yǔ)句浓恳,然后重新建立數(shù)據(jù)庫(kù),再讀取文件重建數(shù)據(jù)表和其中的數(shù)據(jù)碗暗。
至此颈将,我們已經(jīng)為這個(gè)電影網(wǎng)站加上了數(shù)據(jù)庫(kù)。但顯然言疗,我不可能手動(dòng)添加眾多電影信息晴圾。所以接下來(lái),我需要一些外部的數(shù)據(jù)源噪奄,來(lái)擴(kuò)充這個(gè)網(wǎng)站的內(nèi)容死姚。豆瓣是個(gè)好網(wǎng)站,嗯勤篮。
注意:
1都毒、在Python中操作數(shù)據(jù)庫(kù)時(shí),要先導(dǎo)入數(shù)據(jù)庫(kù)對(duì)應(yīng)的驅(qū)動(dòng)叙谨,然后温鸽,通過(guò)Connection對(duì)象和Cursor對(duì)象操作數(shù)據(jù)。
2、要確保打開(kāi)的Connection對(duì)象和Cursor對(duì)象都正確地被關(guān)閉涤垫,否則姑尺,資源就會(huì)泄露。
3蝠猬、如何才能確保出錯(cuò)的情況下也關(guān)閉掉Connection對(duì)象和Cursor對(duì)象呢切蟋?請(qǐng)回憶try:...except:...finally:...的用法。
【二】MySQL
MySQL是Web世界中使用最廣泛的數(shù)據(jù)庫(kù)服務(wù)器榆芦。SQLite的特點(diǎn)是輕量級(jí)柄粹、可嵌入,但不能承受高并發(fā)訪問(wèn)匆绣,適合桌面和移動(dòng)應(yīng)用驻右。而MySQL是為服務(wù)器端設(shè)計(jì)的數(shù)據(jù)庫(kù),能承受高并發(fā)訪問(wèn)崎淳,同時(shí)占用的內(nèi)存也遠(yuǎn)遠(yuǎn)大于SQLite堪夭。
此外,MySQL內(nèi)部有多種數(shù)據(jù)庫(kù)引擎拣凹,最常用的引擎是支持?jǐn)?shù)據(jù)庫(kù)事務(wù)的InnoDB森爽。
安裝MySQL可以直接從MySQL官方網(wǎng)站下載最新的Community Server 5.6.x版本。MySQL是跨平臺(tái)的嚣镜,選擇對(duì)應(yīng)的平臺(tái)下載安裝文件即可爬迟。
在Windows上,安裝時(shí)請(qǐng)選擇UTF-8編碼菊匿,以便正確地處理中文付呕;在Mac或Linux上,需要編輯MySQL的配置文件捧请,把數(shù)據(jù)庫(kù)默認(rèn)的編碼全部改為UTF-8凡涩。MySQL的配置文件默認(rèn)存放在/etc/my.cnf或者/etc/mysql/my.cnf:
[client]
default-character-set =utf8
[mysqld]
default-storage-engine =INNODB
character-set-server =utf8
collation-server =utf8_general_ci
重啟MySQL后,可以通過(guò)MySQL的客戶端命令行檢查編碼:
由于MySQL服務(wù)器以獨(dú)立的進(jìn)程運(yùn)行疹蛉,并通過(guò)網(wǎng)絡(luò)對(duì)外服務(wù)活箕,所以,需要支持Python的MySQL驅(qū)動(dòng)來(lái)連接到MySQL服務(wù)器可款。
目前育韩,有兩個(gè)MySQL驅(qū)動(dòng):
①mysql-connector-python:是MySQL官方的純Python驅(qū)動(dòng);
②MySQL-python:是封裝了MySQL C驅(qū)動(dòng)的Python驅(qū)動(dòng)闺鲸。
可以把兩個(gè)都裝上筋讨,使用的時(shí)候再?zèng)Q定用哪個(gè):
$ easy_install mysql-connector-python
$ easy_installMySQL-python
我們以mysql-connector-python為例,演示如何連接到MySQL服務(wù)器的test數(shù)據(jù)庫(kù):
由于Python的DB-API定義都是通用的摸恍,所以悉罕,操作MySQL的數(shù)據(jù)庫(kù)代碼和SQLite類(lèi)似赤屋。
注意:
1、MySQL的SQL占位符是%s壁袄;
2类早、通常我們?cè)谶B接MySQL時(shí)傳入use_unicode=True,讓MySQL的DB-API始終返回Unicode嗜逻。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?除夕快樂(lè)大家涩僻!