python|初探數(shù)據(jù)庫(kù)

前言

如果你想用做個(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為例:

基本的數(shù)據(jù)操作
數(shù)據(jù)查詢(xún)

所以對(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的客戶端命令行檢查編碼:

看到utf8字樣就表示編碼設(shè)置正確

安裝MySQL驅(qū)動(dòng)

由于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ù):

連接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è)大家涩僻!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市栈顷,隨后出現(xiàn)的幾起案子逆日,更是在濱河造成了極大的恐慌,老刑警劉巖萄凤,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件室抽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛙卤,警方通過(guò)查閱死者的電腦和手機(jī)狠半,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)颤难,“玉大人,你說(shuō)我怎么就攤上這事已维⌒朽停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵垛耳,是天一觀的道長(zhǎng)栅屏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)堂鲜,這世上最難降的妖魔是什么栈雳? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮缔莲,結(jié)果婚禮上哥纫,老公的妹妹穿的比我還像新娘。我一直安慰自己痴奏,他們只是感情好蛀骇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著读拆,像睡著了一般擅憔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上檐晕,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天暑诸,我揣著相機(jī)與錄音,去河邊找鬼。 笑死个榕,一個(gè)胖子當(dāng)著我的面吹牛篡石,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笛洛,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼夏志,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了苛让?” 一聲冷哼從身側(cè)響起沟蔑,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狱杰,沒(méi)想到半個(gè)月后瘦材,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仿畸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年食棕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片错沽。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡簿晓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出千埃,到底是詐尸還是另有隱情憔儿,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布放可,位于F島的核電站谒臼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏耀里。R本人自食惡果不足惜蜈缤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冯挎。 院中可真熱鬧底哥,春花似錦、人聲如沸织堂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)易阳。三九已至附较,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間潦俺,已是汗流浹背拒课。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工徐勃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人早像。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓僻肖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親卢鹦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子臀脏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容