在工做中,咱們須要常常對數據庫進行操做,好比 Oracle、MySQL、SQL Sever 等,今天咱們就學習如何利用Python來操做 MySQL
數據庫。mysql
本人環境:Python 3.7.0 、MySQL 5.7sql
使用Python來操做MySQL,須要用到 PyMySQL
這個第三方庫,具體安裝以下:數據庫
pip install PyMySQL學習
我這裏安裝的版本是 0.9.3
。fetch
Python操做MySQL的步驟以下:code
- 創建數據庫鏈接
- 經過
cursor()
建立遊標對象(pymysql經過遊標來執行sql和獲取結果)- 使用
execute()
執行sql- 獲取結果(查詢)/提交事務(增刪改)
- 關閉遊標
- 關閉鏈接
注意:用Python進行增刪改查操做以前,最好先檢查下sql語句是否正確,確保沒有錯誤以後,再放到Python代碼中。orm
查詢操做對象
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
,目的是爲了讓查詢結果以 列表嵌套字典
的格式輸出,以方便後續操做。若是不使用該參數,那麼返回的查詢結果將是 元組嵌套元組
的形式。blog
更新操做事務
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)