21.1 介紹
21.1.1 持久存儲
21.1.2 基本的數據庫操作和SQL語言
底層存儲
數據庫的底層存儲通常使用文件系統,它可以是普通操作系統文件,專用操作系統
文件,甚至有可能是磁盤分區
用戶界面
大部分數據庫系統會提供一個命令行工具來執行SQL命令和查詢,也有一些使用圖
形界面
數據庫
關係型數據庫管理系統通常都支持多個數據庫,如果其基於服務器,這些數據庫都
在同一臺服務器上,本例,MYSQL是一種基於服務器的關係數據庫管理系統
組件
你可以將數據庫存儲想象爲一個表格,每行數據都有一個或多個字段對應數據庫
的列,每個表每個列及其數據類型的集合構成數據庫結構的定義,數據庫能夠被創
建,也可以被刪除
SQL
數據庫命令和查詢操作需要通過SQL語句來執行
創建數據庫和賦予權限
CREATE DATABASE test;
GRANT ALL ON test.* to user(s);
選擇要使用的數據庫
USE test;
刪除數據庫
DROP DATABASE test;
創建表
CREATE TABLE users(login VARCHAR(8),uid INT,prid INT);
刪除表
DROP TABLE users;
插入行
INSERT INTO users VALUES('leanna',311,1)
更新行
UPDATE users SET prid=4 WHERE prid=2;
UPDATE users SET prid=1 WHERE uid=311;
刪除行
DELETE FROM users WHERE prid=%d;
DELETE FROM users;
21.1.3 數據庫和Python
21.2 Python數據庫應用程序
程序員接口(DB-API)
21.2.1 模塊屬性
數據屬性
屬性名描述
apilevelDB-API模塊兼容的DB-API版本號
threadsafety線程安全級別
parmstyle該模塊支持的SQL語句參數風格
connect()連接函數
MySQLdb.connect(host='dbserv',db='inv',user='smith')
21.2.2 連接對象
要與數據庫進行通信,必須先和數據庫建立連接,連接對象處理命令如何送往服務
器,以及如何從服務器接收數據等基礎功能,連接成功後就能向數據庫服務器發送
請求,得到響應
連接對象方法
close()關閉數據庫連接
commit()提交當前事務
rollback()取消當前事務
cursor()使用這個連接創建並返回一個遊標或類遊標的對象
errorhandler(cxn, cur,errcls,errval)
21.2.3 遊標對象
當你建立連接之後,就可以與數據庫進行交互,一個遊標允許用戶執行數據庫命令
和得到查詢結果,一個Python DB-API遊標對象總是扮演遊標角色,無論數據庫是
否真正支持遊標,從這一點講,數據庫接口程序必須實現遊標對象,只有這樣才能
保證無論使用何種後端數據庫你的代碼都不需要做任何改變
21.2.4 類型對象和構造器
21.2.5 關係數據庫
21.2.6 數據庫和Python:接口程序
MySQL
# api-get install python-mysql* -y
# python
>>> import MySQLdb
>>> cxn = MySQLdb.connect(user='root',passwd='123456')
>>> cxn.query('DROP DATABASE test')
>>> cxn.query('CREATE DATABASE test')
>>> cxn.query("GRANT ALL ON test.* to 'test'@localhost")
>>> cxn.commit()
>>> cxn.close()
以上代碼我們沒有使用cursor對象,某些接口程序擁有連接對象,這些連接對象擁
有query()方法,可以執行SQL查詢,我們不建議使用這種方法
下面我們使用遊標對象(cursors)和他們的execute()方法,下一個交互集演示了
創建表
>>> cxn = MySQLdb.connect(user='root',passwd='123456',db='test')
>>> cur = cxn.cursor()
>>> cur.execute('CREATE TABLE users(login VARCHAR(8), uid INT)')
0L
>>> cur.execute("INSERT INTO users VALUES('john',7000)")
1L
>>> cur.execute("INSERT INTO users VALUES('john',7001)")
1L
>>> cur.execute("INSERT INTO users VALUES('jane',7001)")
1L
>>> cur.execute("INSERT INTO users VALUES('bob',7200)")
1L
>>> cur.execute("SELECT * FROM users WHERE login LIKE 'j%'")
3L
>>> for data in cur.fetchall():
... print '%s\t%s' % data
...
john 7000
john 7001
jane 7001
最後一個特性是更新表,包括更新或刪除數據
>>> cur.execute("UPDATE users SET uid=7100 WHERE uid=7001")
2L
>>> cur.execute("SELECT * FROM users")
4L
>>> for data in cur.fetchall():
... print '%s\t%s' % data
...
john 7000
john 7100
jane 7100
bob 7200
>>> cur.execute("UPDATE users SET uid=7100 WHERE uid= 7000")
1L
>>> cur.execute("SELECT * FROM users")
4L
>>> for data in cur.fetchall():
... print '%s\t%s' % data
...
john 7100
john 7100
jane 7100
bob 7200
>>> cur.execute('DELETE FROM users WHERE login="bob"')
1L
>>> cur.execute('DROP TABLE users')
0L
>>> cur.close()
>>> cxn.commit()
>>> cxn.close()
21.3 對象-關係管理器(ORMs)
21.3.1 考慮對象,而不是SQL
21.3.2 Python和ORM
21.3.4 總結
21.4 相關模塊