我們經常需要將大量數據保存起來以備后續使用,數據庫是一個很好的解決方案。在眾多數據庫中,MySQL數據庫算是入門比較簡單、語法比較簡單,同時也比較實用的一個。在這篇博客中,將以MySQL數據庫為例,介紹一下如何使用Python操作數據庫。
本科階段曾學過使用Java對MySQL數據庫進行操作,基本思路是先連接數據庫,然后執行SQL語句對數據庫進行操作,最后打印結果並斷開連接。使用Python操作數據庫的流程和以上過程基本一致,在對其進行介紹之前,先介紹一些基本的概念。
1 基本概念
1.1 使用python操作數據庫的流程
以流程圖的方式展示python操作MySQL數據庫的流程:

對上圖的解讀:首先依次創建Connection對象(數據庫連接對象)用於打開數據庫連接,創建Cursor對象(游標對象)用於執行查詢和獲取結果;然后執行SQL語句對數據庫進行增刪改查等操作並提交事務,此過程如果出現異常則使用回滾技術使數據庫恢復到執行SQL語句之前的狀態;最后,依次銷毀Cursor對象和Connection對象。
下面依次對Connection對象、Cursor對象和事務等概念進行介紹。
1.2 Connection對象
Connection對象即為數據庫連接對象,在python中可以使用pymysql.connect()方法創建Connection對象,該方法的常用參數如下:
host:連接的數據庫服務器主機名,默認為本地主機(localhost);字符串類型 user:用戶名,默認為當前用戶;字符串類型 passwd:密碼,無默認值;字符串類 db:數據庫名稱,無默認值;字符串類型 port:指定數據庫服務器的連接端口,默認為3306;整型
Connection對象常用的方法如下:
cursor():使用當前連接創建並返回游標 commit():提交當前事務 rollback():回滾當前事務 close():關閉當前連接
1.3 Cursor對象
Cursor對象即為游標對象,用於執行查詢和獲取結果,在python中可以使用conn.cursor()創建,conn為Connection對象。Cursor對象常用的方法和屬性如下:
execute():執行數據庫查詢或命令,將結果從數據庫獲取到客戶端 fetchone():獲取結果集的下一行 fetchmany():獲取結果集的下幾行 fetchall():獲取結果集中剩下的所有行 close():關閉當前游標對象 rowcount:最近一次的execute返回數據的行數或受影響的行數
execute()方法和fetch類方法的工作示原理如下圖所示:


1.4 事務
事務是數據庫理論中一個比較重要的概念,指訪問和更新數據庫的一個程序執行單元,具有ACID特性:
原子性(Atomic):事務中的各項操作要么全都做,要么全都不做,任何一項操作的失敗都會導致整個事務的失敗 一致性(Consistent):事務必須使數據庫從一個一致性狀態變到另一個一致性狀態 隔離性(Isolated):並發執行的事務彼此無法看到對方的中間狀態,一個事務的執行不能被其他事務干擾 持久性(Durable):事務一旦提交,它對數據庫的改變就是永久性的,可以通過日志和同步備份在故障發生后重建數據。
在開發時,我們以以下三種方式使用事務:
正常結束事務:conn.commit() 異常結束事務:conn.rollback() 關閉自動commit:設置 conn.autocommit(False)
2 使用python實現對MySQL數據庫的增刪改查等操作
在python中操作MySQL數據庫時,要使用的模塊是:
Python2中:mysqldb(pip2 install mysqldb) Python3中:pymysql(pip3 install pymysql)
本篇博客所使用的環境為:
python 3.6 win 10 pycharm 2018.1 pymysql 0.9.2 mysql 5.5 Navicat 11
下面將以具體代碼的形式依次介紹python中如何實現對MySQL數據庫的增刪改查等操作。數據庫截圖如下:

2.1 連接數據庫
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#-*-coding:utf-
8
-*-
""
"
@author
:taoshouzheng
@time
:
2018
/
7
/
18
9
:
24
@email
:tsz1216
@sina
.com
""
"
import
pymysql
# 打開數據庫連接
conn = pymysql.connect(
'localhost'
,
'root'
,
'root'
,
'test_db'
)
# 使用cursor()方法創建一個游標對象
cursor = conn.cursor()
# 使用execute()方法執行SQL查詢
cursor.execute(
'SELECT VERSION()'
)
# 使用fetchone()方法獲取單條數據
data = cursor.fetchone()
# 打印
print(
'database version: %s'
% data)
# 關閉數據庫連接
conn.close()
# 結果
# database version:
5.5
.
20
|
2.2 創建數據表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#-*-coding:utf-
8
-*-
""
"
@author
:taoshouzheng
@time
:
2018
/
7
/
18
9
:
24
@email
:tsz1216
@sina
.com
""
"
import
pymysql
# 打開數據庫連接
conn = pymysql.connect(
'localhost'
,
'root'
,
'root'
,
'test_db'
)
# 使用cursor()方法創建一個游標對象cursor
cursor = conn.cursor() # 游標對象用於執行查詢和獲取結果
# 使用execute()方法執行SQL,如果表存在則將其刪除
cursor.execute(
'DROP TABLE IF EXISTS EMPLOYEE'
)
# 使用預處理語句創建表
sql =
""
"CREATE TABLE `employee` (
`first_name` varchar(
255
) DEFAULT NULL COMMENT
'姓'
,
`last_name` varchar(
255
) DEFAULT NULL COMMENT
'名'
,
`age`
int
(
11
) DEFAULT NULL COMMENT
'年齡'
,
`sex` varchar(
255
) DEFAULT NULL COMMENT
'性別'
,
`income` varchar(
255
) DEFAULT NULL COMMENT
'收入'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
""
"
# 執行SQL語句
cursor.execute(sql)
# 關閉數據庫連接
conn.close()
|
效果截圖如下:


2.3 數據庫插入操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#-*-coding:utf-
8
-*-
""
"
@author
:taoshouzheng
@time
:
2018
/
7
/
18
9
:
24
@email
:tsz1216
@sina
.com
""
"
import
pymysql
# 打開數據庫連接
conn = pymysql.connect(
'localhost'
,
'root'
,
'root'
,
'test_db'
)
# 使用cursor()方法獲取操作游標
cursor = conn.cursor()
# SQL語句:向數據表中插入數據
sql =
""
"INSERT INTO employee(first_name,
last_name, age, sex, income)
VALUES (
'趙'
,
'麗穎'
,
38
,
'女'
,
15000
)
""
"
# 異常處理
try
:
# 執行SQL語句
cursor.execute(sql)
# 提交事務到數據庫執行
conn.commit() # 事務是訪問和更新數據庫的一個程序執行單元
except:
# 如果發生錯誤則執行回滾操作
conn.rollback()
# 關閉數據庫連接
conn.close()
|
效果截圖如下:


2.4 數據庫查詢操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
#-*-coding:utf-
8
-*-
""
"
@author
:taoshouzheng
@time
:
2018
/
7
/
18
9
:
25
@email
:tsz1216
@sina
.com
""
"
import
pymysql
# 打開數據庫連接
conn = pymysql.connect(
'localhost'
,
'root'
,
'root'
,
'test_db'
)
# 使用cursor()方法獲取操作游標
cursor = conn.cursor()
# SQL語句:查詢
sql =
"SELECT * FROM employee WHERE income > 1000 "
# 異常處理
try
:
# 執行SQL語句
cursor.execute(sql)
# 獲取所有的記錄列表
results = cursor.fetchall()
# 遍歷列表
for
row in results:
# 打印列表元素
print(row)
# 姓
first_name = row[
0
]
# 名
last_name = row[
1
]
# 年齡
age = row[
2
]
# 性別
sex = row[
3
]
# 收入
income = row[
4
]
# 打印列表元素
print(first_name, last_name, age, sex, income)
except:
print(
'Uable to fetch data!'
)
# 關閉數據庫連接
conn.close()
|
效果截圖如下:


2.5 數據庫更新操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#-*-coding:utf-
8
-*-
""
"
@author
:taoshouzheng
@time
:
2018
/
7
/
18
10
:
18
@email
:tsz1216
@sina
.com
""
"
import
pymysql
# 打開數據庫連接
conn = pymysql.connect(
'localhost'
,
'root'
,
'root'
,
'test_db'
)
# 使用cursor()方法獲取操作游標
cursor = conn.cursor()
# SQL語句,執行更新操作
sql =
'UPDATE employee SET age = age + 5 WHERE sex = "男"'
# 異常處理
try
:
# 執行SQL語句
cursor.execute(sql)
# 提交到數據庫執行
conn.commit()
except:
# 發生錯誤時回滾
conn.rollback()
# 關閉數據庫連接
conn.close()
|
效果截圖如下:


2.6 數據庫刪除操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#-*-coding:utf-
8
-*-
""
"
@author
:taoshouzheng
@time
:
2018
/
7
/
18
9
:
25
@email
:tsz1216
@sina
.com
""
"
import
pymysql
# 打開數據庫連接
conn = pymysql.connect(
'localhost'
,
'root'
,
'root'
,
'test_db'
)
# 使用cursor()方法獲取操作游標
cursor = conn.cursor()
# SQL語句,執行刪除操作
sql =
'DELETE FROM employee WHERE income > 5000 AND age >35'
# 異常處理
try
:
# 執行SQL語句
cursor.execute(sql)
# 提交到數據庫執行
conn.commit()
except:
# 發生錯誤時回滾
conn.rollback()
# 關閉數據庫連接
conn.close()
|

