數據庫接口的 Python 標準是 Python DB-API。大多數 Python 數據庫接口都遵循這個標準。
您可以為您的應用程序選擇正確的數據庫。Python 數據庫 API 支持廣泛的數據庫服務器,例如 -
虻
mSQL
MySQL
PostgreSQL
微軟 SQL Server 2000
Informix
基地間
甲骨文
賽貝斯
以下是可用 Python 數據庫接口的列表:Python 數據庫接口和 API。您必須為需要訪問的每個數據庫下載單獨的 DB API 模塊。例如,如果您需要訪問 Oracle 數據庫和 MySQL 數據庫,則必須同時下載 Oracle 和 MySQL 數據庫模塊。
DB API 為盡可能使用 Python 結構和語法處理數據庫提供了最低標準。該 API 包括以下內容 -
導入 API 模塊。
獲取與數據庫的連接。
發出 SQL 語句和存儲過程。
關閉連接
我們將使用 MySQL 學習所有概念,所以讓我們談談 MySQLdb 模塊。
什么是 MySQLdb?
MySQLdb 是一個用于從 Python 連接到 MySQL 數據庫服務器的接口。它實現了 Python 數據庫 API v2.0,并構建在 MySQL C API 之上。
如何安裝 MySQLdb?
在繼續之前,請確保您的機器上安裝了 MySQLdb。只需在您的 Python 腳本中輸入以下內容并執行它 -
#!/usr/bin/python
import MySQLdb
如果它產生以下結果,則表示未安裝 MySQLdb 模塊 -
Traceback (most recent call last):
File "test.py", line 3, in <module>
import MySQLdb
ImportError: No module named MySQLdb
要安裝 MySQLdb 模塊,請使用以下命令 -
For Ubuntu, use the following command -
$ sudo apt-get install python-pip python-dev libmysqlclient-dev
For Fedora, use the following command -
$ sudo dnf install python python-devel mysql-devel redhat-rpm-config gcc
For Python command prompt, use the following command -
pip install MySQL-python
注意- 確保您具有安裝上述模塊的 root 權限。
數據庫連接
在連接到 MySQL 數據庫之前,請確保以下內容 -
您已經創建了一個數據庫 TESTDB。
您已經在 TESTDB 中創建了一個表 EMPLOYEE。
此表包含字段 FIRST_NAME、LAST_NAME、AGE、SEX 和 INCOME。
用戶 ID“testuser”和密碼“test123”設置為訪問 TESTDB。
Python 模塊 MySQLdb 已正確安裝在您的機器上。
您已通過 MySQL 教程了解MySQL 基礎知識。
例子
以下是連接 MySQL 數據庫“TESTDB”的示例
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# execute SQL query using execute() method.
cursor.execute("SELECT VERSION()")
# Fetch a single row using fetchone() method.
data = cursor.fetchone()
print "Database version : %s " % data
# disconnect from server
db.close()
運行此腳本時,它會在我的 Linux 機器中產生以下結果。
Database version : 5.0.45
如果與數據源建立了連接,則返回一個連接對象并將其保存到db中以供進一步使用,否則db設置為 None。接下來,db對象用于創建游標對象,該對象又用于執行 SQL 查詢。最后,在出來之前,確保關閉數據庫連接并釋放資源。
創建數據庫表
一旦建立了數據庫連接,我們就可以使用創建的游標的執行方法在數據庫表中創建表或記錄。
例子
讓我們創建數據庫表 EMPLOYEE -
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# Create table as per requirement
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
# disconnect from server
db.close()
插入操作
當您要將記錄創建到數據庫表中時,它是必需的。
例子
以下示例執行 SQL INSERT語句以在 EMPLOYEE 表中創建記錄 -
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
上面的例子可以寫成如下動態創建 SQL 查詢 -
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
('Mac', 'Mohan', 20, 'M', 2000)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
例子
以下代碼段是另一種執行形式,您可以直接傳遞參數 -
..................................
user_id = "test123"
password = "password"
con.execute('insert into Login values("%s", "%s")' % \
(user_id, password))
..................................
讀操作
對任何數據庫的讀取操作意味著從數據庫中獲取一些有用的信息。
一旦我們的數據庫連接建立,您就可以對該數據庫進行查詢了。您可以使用fetchone()方法獲取單個記錄,也可以使用 fetchall( )方法從數據庫表中獲取多個值。
fetchone() - 它獲取查詢結果集的下一行。結果集是使用游標對象查詢表時返回的對象。
fetchall() - 它獲取結果集中的所有行。如果已經從結果集中提取了一些行,則它會從結果集中檢索剩余的行。
rowcount - 這是一個只讀屬性,返回受 execute() 方法影響的行數。
例子
以下過程從 EMPLOYEE 表中查詢工資超過 1000 的所有記錄 -
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > '%d'" % (1000)
try:
# Execute the SQL command
cursor.execute(sql)
# Fetch all the rows in a list of lists.
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# Now print fetched result
print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
(fname, lname, age, sex, income )
except:
print "Error: unable to fecth data"
# disconnect from server
db.close()
這將產生以下結果 -
fname=Mac, lname=Mohan, age=20, sex=M, income=2000
更新操作
UPDATE 對任何數據庫的操作意味著更新數據庫中已經存在的一條或多條記錄。
以下過程更新所有 SEX 為'M'的記錄。在這里,我們將所有男性的 AGE 增加一年。
例子
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to UPDATE required records
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
WHERE SEX = '%c'" % ('M')
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
刪除操作
當您想從數據庫中刪除一些記錄時,需要執行 DELETE 操作。以下是從 AGE 超過 20 的 EMPLOYEE 中刪除所有記錄的過程 -
例子
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
執行交易
事務是一種確保數據一致性的機制。交易具有以下四個屬性 -
原子性- 交易完成或根本沒有發生任何事情。
一致性- 事務必須以一致的狀態開始,并使系統處于一致的狀態。
隔離- 交易的中間結果在當前交易之外不可見。
持久性 - 一旦提交事務,即使在系統故障之后,效果也是持久的。
Python DB API 2.0 提供了兩種提交或回滾事務的方法。
例子
您已經知道如何實現事務。這又是一個類似的例子 -
# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
提交操作
提交是操作,它向數據庫發出綠色信號以完成更改,并且在此操作之后,無法恢復任何更改。
這是一個調用提交方法的簡單示例。
db.commit()
回滾操作
如果您對一項或多項更改不滿意并且想要完全還原這些更改,請使用rollback()方法。
這是一個調用rollback()方法的簡單示例。
db.rollback()
斷開數據庫
要斷開數據庫連接,請使用 close() 方法。
db.close()
如果用戶使用 close() 方法關閉了與數據庫的連接,則數據庫將回滾任何未完成的事務。但是,您的應用程序最好不要顯式調用提交或回滾,而不是依賴于任何 DB 較低級別的實現細節。
處理錯誤
錯誤的來源有很多。一些示例是執行的 SQL 語句中的語法錯誤、連接失敗或為已取消或完成的語句句柄調用 fetch 方法。
DB API 定義了每個數據庫模塊中必須存在的許多錯誤。下表列出了這些例外情況。
編號 例外與說明
1
警告
用于非致命問題。必須繼承 StandardError。
2
錯誤
錯誤的基類。必須繼承 StandardError。
3
接口錯誤
用于數據庫模塊中的錯誤,而不是數據庫本身。必須子類化錯誤。
4
數據庫錯誤
用于數據庫中的錯誤。必須子類化錯誤。
5
數據錯誤
DatabaseError 的子類,指數據中的錯誤。
6
操作錯誤
DatabaseError 的子類,它指的是諸如丟失與數據庫的連接之類的錯誤。這些錯誤通常不受 Python 腳本編寫者的控制。
7
完整性錯誤
DatabaseError 的子類,用于可能破壞關系完整性的情況,例如唯一性約束或外鍵。
8
內部錯誤
DatabaseError 的子類,它引用數據庫模塊內部的錯誤,例如游標不再處于活動狀態。
9
編程錯誤
DatabaseError 的子類,它指的是錯誤的表名和其他可以安全歸咎于您的錯誤。
10
不支持錯誤
DatabaseError 的子類,指嘗試調用不受支持的功能。
您的 Python 腳本應該處理這些錯誤,但在使用上述任何異常之前,請確保您的 MySQLdb 支持該異常。您可以通過閱讀 DB API 2.0 規范來獲得有關它們的更多信息。