1 Python標准數據庫接口DB-API介紹
Python標准數據庫接口為 Python DB-API,它為開發人員提供了數據庫應用編程接口。Python DB-API支持很多種的數據庫,你可以選擇跟自己項目相關的數據庫。Python DB-API支持的數據庫如下所示:
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
不同的數據庫你需要下載不同的DB API模塊,例如你需要訪問Oracle數據庫和Mysql數據,你需要下載Oracle和MySQL數據庫模塊。Python的DB-API,為大多數的數據庫實現了接口,使用它連接各數據庫后,就可以用相同的方式操作各數據庫。
Python DB-API使用流程:
1)引入 API 模塊。
2)獲取與數據庫的連接。
3)執行SQL語句和存儲過程。
4)關閉數據庫連接。
Python的數據庫學習,主要在於學習DB-API的學習流程,記住這四步,你就已經成功了一大半了。
2 MySQL的安裝
因為博主目前只關注MySQL的使用,所以本文中只限於介紹如何利用Python來操作MySQL數據庫。下面簡單介紹一下如何為自己的Python IDE安裝MySQL:
Step1 確認是否已經安裝有MySQL,執行以下代碼:
# encoding: utf-8 #!/usr/bin/python
import MySQLdb
如果執行后報錯就說明沒有安裝MySQL,否則則證明你已經無需安裝MySQL。
Step2 下載MySQL並安裝:
下載地址一:請點這里;
下載地址二:請點這里。
具體的安裝步驟和Python的其他庫安裝方式類似,不在贅述。你可以用Step1的方法來確認你是否已經成功安裝MySQL。
3 數據庫連接
連接數據庫前,請先確認以下事項:連接數據庫TESTDB使用的用戶名為 "testuser" ,密碼為 "test123",你可以可以自己設定或者直接使用root用戶名及其密碼。
以下實例鏈接Mysql的TESTDB數據庫,對應了DB-API的四個步驟:
# encoding: utf-8 #!/usr/bin/python
# 1 引入API模塊 import MySQLdb
# 2 獲取與數據庫的連接
# 打開數據庫連接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# 3 執行SQL語句和存儲過程
# 使用cursor()方法獲取操作游標 cursor = db.cursor() # 使用execute方法執行SQL語句 cursor.execute("SELECT VERSION()") # 使用 fetchone() 方法獲取一條數據庫。 data = cursor.fetchone() print "Database version : %s " % data
# 4 關閉數據庫連接 # 關閉數據庫連接 db.close()
執行結果顯示:
Database version : 5.0.45
4 創建數據庫表
我們嘗試建立一個自定義的數據庫表:
數據庫表名稱:EMPLOYEEEMPLOYEE
數據表字段為:FIRST_NAME,LAST_NAME,AGE,SEX 和 INCOME。
# encoding: utf-8 #!/usr/bin/python import MySQLdb # 打開數據庫連接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法獲取操作游標 cursor = db.cursor() # 如果數據表已經存在使用 execute() 方法刪除表。 cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") # 創建數據表SQL語句 sql = """CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )""" cursor.execute(sql) # 關閉數據庫連接 db.close()
5 插入數據操作
使用SQL INSERT 語句向數據庫表 EMPLOYEE 插入記錄:
# encoding: utf-8 #!/usr/bin/python import MySQLdb # 打開數據庫連接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法獲取操作游標 cursor = db.cursor() # SQL 插入語句 sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" try: # 執行sql語句 cursor.execute(sql) # 提交到數據庫執行 db.commit() except: # Rollback in case there is any error db.rollback() # 關閉數據庫連接 db.close()
在這里提幾個重要的點:
1)請注意一定要有conn.commit()這句來提交事務,要不然不能真正的插入數據。
2)dollback()是回滾操作,回滾(Rollback)指的是程序或數據處理錯誤,將程序或數據恢復到上一次正確狀態的行為。回滾包括程序回滾和數據回滾等類型。
6 數據庫查詢操作
Python查詢Mysql使用 fetchone() 方法獲取單條數據, 使用fetchall() 方法獲取多條數據。
- fetchone():該方法獲取下一個查詢結果集。結果集是一個對象
- fetchall():接收全部的返回結果行.
- rowcount:這是一個只讀屬性,並返回執行execute()方法后影響的行數。
查詢EMPLOYEE表中salary(工資)字段大於1000的所有數據:
# encoding: utf-8 #!/usr/bin/python import MySQLdb # 打開數據庫連接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法獲取操作游標 cursor = db.cursor() # SQL 查詢語句 sql = "SELECT * FROM EMPLOYEE \ WHERE INCOME > '%d'" % (1000) try: # 執行SQL語句 cursor.execute(sql) # 獲取所有記錄列表 results = cursor.fetchall() for row in results: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # 打印結果 print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \ (fname, lname, age, sex, income ) except: print "Error: unable to fecth data" # 關閉數據庫連接 db.close()
執行結果顯示:
fname=Mac, lname=Mohan, age=20, sex=M, income=2000
7 數據庫更新操作
更新操作用於更新數據表的的數據,以下實例將 TESTDB表中的 SEX 字段全部修改為 'M',AGE 字段遞增1:
# encoding: utf-8 #!/usr/bin/python import MySQLdb # 打開數據庫連接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法獲取操作游標 cursor = db.cursor() # SQL 更新語句 sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') try: # 執行SQL語句 cursor.execute(sql) # 提交到數據庫執行 db.commit() except: # 發生錯誤時回滾 db.rollback() # 關閉數據庫連接 db.close()
8 數據庫的事務機制
事務機制可以確保數據一致性。
事務應該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為ACID特性。
- 原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要么都做,要么都不做。
- 一致性(consistency)。事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
- 隔離性(isolation)。一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相干擾。
- 持久性(durability)。持續性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
Python DB API 2.0 的事務提供了兩個方法 commit 或 rollback。
比如:
# SQL刪除記錄語句 sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # 執行SQL語句 cursor.execute(sql) # 向數據庫提交 db.commit() except: # 發生錯誤時回滾 db.rollback()
對於支持事務的數據庫, 在Python數據庫編程中,當游標建立之時,就自動開始了一個隱形的數據庫事務。
commit()方法游標的所有更新操作,rollback()方法回滾當前游標的所有操作。每一個方法都開始了一個新的事務。
9 常用函數
下面總結一下常用的函數:
1)Connect() 方法用於創建數據庫的連接,里面可以指定參數:用戶名,密碼,主機等信息。這只是連接到了數據庫,要想操作數據庫需要創建游標。
2)commit() 提交
3)rollback() 回滾
4)cursor用來執行命令的方法:
callproc(self, procname, args):用來執行存儲過程,接收的參數為存儲過程名和參數列表,返回值為受影響的行數
execute(self, query, args):執行單條sql語句,接收的參數為sql語句本身和使用的參數列表,返回值為受影響的行數
executemany(self, query, args):執行單挑sql語句,但是重復執行參數列表里的參數,返回值為受影響的行數
nextset(self):移動到下一個結果集
5)cursor用來接收返回值的方法:
fetchall(self):接收全部的返回結果行.
fetchmany(self, size=None):接收size條返回結果行.如果size的值大於返回的結果行的數量,則會返回cursor.arraysize條數據.
fetchone(self):返回一條結果行.
6)scroll(self, value, mode='relative'):移動指針到某一行.如果mode='relative',則表示從當前所在行移動value條,如果 mode='absolute',則表示從結果集的第一行移動value條.
10 參考內容
[1] W3CSCHOOL.CC python操作mysql數據庫
[2] 一個人的旅行
[3] 蟲師