前言
在工作中,我們需要經常對數據庫進行操作,比如 Oracle、MySQL、SQL Sever 等,今天我們就學習如何利用Python來操作 MySQL
數據庫。
本人環境:Python 3.7.0 、MySQL 5.7
安裝第三方庫
使用Python來操作MySQL,需要用到 PyMySQL
這個第三方庫,具體安裝如下:
pip install PyMySQL
我這里安裝的版本是 0.9.3
。
基本操作-增刪改查
Python操作MySQL的步驟如下:
- 建立數據庫連接
- 通過
cursor()
創建游標對象(pymysql通過游標來執行sql和獲取結果)- 使用
execute()
執行sql- 獲取結果(查詢)/提交事務(增刪改)
- 關閉游標
- 關閉連接
注意:用Python進行增刪改查操作之前,最好先檢查下sql語句是否正確,確保沒有錯誤之后,再放到Python代碼中。
查詢操作
import pymysql
def select_db(select_sql):
"""查詢"""
# 建立數據庫連接
db = pymysql.connect(
host="192.168.89.128",
port=3306,
user="root",
passwd="123456",
db="test2020"
)
# 通過 cursor() 創建游標對象,並讓查詢結果以字典格式輸出
cur = db.cursor(cursor=pymysql.cursors.DictCursor)
# 使用 execute() 執行sql
cur.execute(select_sql)
# 使用 fetchall() 獲取所有查詢結果
data = cur.fetchall()
# 關閉游標
cur.close()
# 關閉數據庫連接
db.close()
return data
select_sql = 'SELECT * FROM user WHERE username="張三"'
print(select_db(select_sql))
在上面,創建游標時使用了 cursor=pymysql.cursors.DictCursor
,目的是為了讓查詢結果以 列表嵌套字典
的格式輸出,以方便后續操作。如果不使用該參數,那么返回的查詢結果將是 元組嵌套元組
的形式。
更新操作
import pymysql
def update_db(update_sql):
"""更新"""
# 建立數據庫連接
db = pymysql.connect(
host="192.168.89.128",
port=3306,
user="root",
passwd="123456",
db="test2020"
)
# 通過 cursor() 創建游標對象
cur = db.cursor()
try:
# 使用 execute() 執行sql
cur.execute(update_sql)
# 提交事務
db.commit()
except Exception as e:
print("操作出現錯誤:{}".format(e))
# 回滾所有更改
db.rollback()
finally:
# 關閉游標
cur.close()
# 關閉數據庫連接
db.close()
update_sql = 'UPDATE user SET username = "張三2" WHERE id = 1'
update_db(update_sql)
在執行更新操作sql時,需要使用事務處理,即使用創建的連接進行提交事務 db.commit()
,使當前更改生效。當執行sql語句出現錯誤時,還應該支持事務回滾操作 db.rollback()
。
新增操作
import pymysql
def insert_db(insert_sql):
"""插入"""
# 建立數據庫連接
db = pymysql.connect(
host="192.168.89.128",
port=3306,
user="root",
passwd="123456",
db="test2020"
)
# 通過 cursor() 創建游標對象
cur = db.cursor()
try:
# 使用 execute() 執行sql
cur.execute(insert_sql)
# 提交事務
db.commit()
except Exception as e:
print("操作出現錯誤:{}".format(e))
# 回滾所有更改
db.rollback()
finally:
# 關閉游標
cur.close()
# 關閉數據庫連接
db.close()
insert_sql = 'INSERT INTO user(id, username, password) VALUES(11, "王五", "333333")'
insert_db(insert_sql)
在執行新增操作sql時,需要像 更新操作
一樣,使用事務來處理。
刪除操作
import pymysql
def delete_db(delete_sql):
"""刪除"""
# 建立數據庫連接
db = pymysql.connect(
host="192.168.89.128",
port=3306,
user="root",
passwd="123456",
db="test2020"
)
# 通過 cursor() 創建游標對象
cur = db.cursor()
try:
# 使用 execute() 執行sql
cur.execute(delete_sql)
# 提交事務
db.commit()
except Exception as e:
print("操作出現錯誤:{}".format(e))
# 回滾所有更改
db.rollback()
finally:
# 關閉游標
cur.close()
# 關閉數據庫連接
db.close()
delete_sql = 'DELETE FROM user WHERE id = 11'
delete_db(delete_sql)
在執行刪除操作sql時,需要像 更新操作、插入操作
一樣,使用事務來處理。
簡單封裝數據庫操作
從上面的代碼中,我們可以發現存在不少問題,比如增刪改操作的代碼除了執行的sql不同外,其他代碼都是一樣的;同時每個操作時都寫了一次建立數據庫連接的代碼,也就是說每次操作都會建立和刪除連接的操作。
針對上面的問題,我們完全可以對上面的增刪改查操作進行簡單的封裝,把Python操作MySQL的代碼封裝到一個類中,只在創建對象實例的時候建立數據庫連接,只在對象刪除時關閉連接。
以下是對數據庫操作的簡單封裝:
import pymysql
class MysqlDb():
def __init__(self, host, port, user, passwd, db):
# 建立數據庫連接
self.conn = pymysql.connect(
host=host,
port=port,
user=user,
passwd=passwd,
db=db
)
# 通過 cursor() 創建游標對象,並讓查詢結果以字典格式輸出
self.cur = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
def __del__(self): # 對象資源被釋放時觸發,在對象即將被刪除時的最后操作
# 關閉游標
self.cur.close()
# 關閉數據庫連接
self.conn.close()
def select_db(self, sql):
"""查詢"""
# 使用 execute() 執行sql
self.cur.execute(sql)
# 使用 fetchall() 獲取查詢結果
data = self.cur.fetchall()
return data
def execute_db(self, sql):
"""更新/插入/刪除"""
try:
# 使用 execute() 執行sql
self.cur.execute(sql)
# 提交事務
self.conn.commit()
except Exception as e:
print("操作出現錯誤:{}".format(e))
# 回滾所有更改
self.conn.rollback()
if __name__ == '__main__':
db = MysqlDb("192.168.89.128", 3306, "root", "123456", "test2020")
select_sql = 'SELECT * FROM user WHERE username="張三2"'
update_sql = 'UPDATE user SET username = "張三2" WHERE id = 1'
insert_sql = 'INSERT INTO user(id, username, password) VALUES(11, "王五", "333333")'
delete_sql = 'DELETE FROM user WHERE id = 11'
data = db.select_db(select_sql)
print(data)
db.execute_db(update_sql)
db.execute_db(insert_sql)
db.execute_db(delete_sql)