1. 程式人生 > 資料庫 >淺談Python訪問MySQL的正確姿勢

淺談Python訪問MySQL的正確姿勢

Py2 時代,訪問 MySQL 資料庫的模組除了 PyMySQL 和 MySQL-python 之外,還有以速度見長的 Umysql,以及非常小眾的 Oursql 模組。進入了 Py3 時代之後,PyMySQL 與時俱進,順利升級到 Py3 版本, MySQL-python 則被它的一個 Py3 分支——mysqlclient 取代,而 Umysql 和 Oursql 則停留在了屬於它們的那個時代。

下表給出了 PyMySQL 模組和 mysqlclient 模組在安裝方式、匯入方式、支援的Python版本和資料庫版本等方面的比較。因為缺少可信的資料,這裡沒有對兩個模組的效能做出比較。不過,PyMySQL 明確宣告支援最新的 MySQL 和 MariaDB,而 mysqlclient 關於資料庫版本支援的描述顯得模稜兩可、似是而非,所以很多人也許會把 PyMySQL 作為首選。但從我們的實際應用來看,mysqlclient 並沒有受到過資料庫版本的限制。我更願意把版本支援的表述解讀為兩個開發團隊風格不同所致。

PyMySQL mysqlclient
安裝方式 pip install PyMySQL pip install mysqlclient
匯入方式 import pymysql import MySQLdb
Python版本 2.7 and >= 3.4 2.7 and >= 3.4
資料庫版本 MySQL >= 5.5
MariaDB >= 5.5
MySQL versions from 3.23 to 5.5;
5.0 or newer recommended.
MariaDB should also work.

有趣的是,不管是 PyMySQL,還是 MySQL-python,或者後來取而代之的 mysqlclient,它們在用法上幾乎完全一致:都是基於 Python database API version 2.0,這個標準也被稱作 PEP-0249。這意味著,我們不用修改程式碼,就可以更換資料庫客戶端。下面的應用例項證明了這一點:除了模組名字不一樣,其餘程式碼完全一致。

姿勢1:以元組形式返回查詢記錄

我們以 PyMySQL 模組為例,先來看看最常見的用法:以元組形式返回查詢記錄。如果把程式碼中的 pymysql 改為 MySQLdb,可以輕鬆切換成 mysqlclient 模組。

>>> import pymysql
>>> db = pymysql.connect(
  host = 'localhost',user = 'xufive',password = '********',db = 'demo',charset = 'utf8'
)
>>> cursor = db.cursor()
>>> cursor.execute('select * from member where id = %s',(100,))
1
>>> print(cursor.fetchall())
((100,'370103********0012','*9EE8E3304D69C3E9260F19C224EA5852129BF030','王茁洋','男',datetime.date(****,**,**),'','濟南','濟南泉景小學','186********',Decimal('1812.50')),)
>>> cursor.close()
>>> db.close()

姿勢2:以字典形式返回查詢記錄

查詢結果以元組形式返回,有很多不便,我們需要知道元組各元素對應的是表結構中的哪一個欄位(列)。下面的程式碼,實現了以字典形式返回查詢記錄。同樣的,如果把程式碼中的 MySQLdb 改為 pymysql,可以輕鬆切換成 PyMySQL 模組。

>>> import MySQLdb.cursors
>>> db = MySQLdb.connect(
  host = 'localhost',charset = 'utf8',cursorclass = MySQLdb.cursors.DictCursor
)
>>> with db.cursor() as cursor:
  sql = 'select * from member where id = %s'
  cursor.execute(sql,))
  print(cursor.fetchall())
 1
({'id': 100,'idcard': '370103********0012','passwd': '*9EE8E3304D69C3E9260F19C224EA5852129BF030','name': '王茁洋','sex': '男','birthday': datetime.date(****,'title': '','address': '濟南','club': '濟南泉景小學','phone': '186********','rating': Decimal('1812.50')},)

姿勢3:事務回滾

事務是關係型資料庫的重要特性,NoSQL資料庫、分散式資料庫通常會淡化、甚至放棄事務。所謂事務是將一組DML(insert、update、delete)語句組合在一起形成一個邏輯單元,這些操作要麼全部執行成功提交(commit),如果不成功就要回退到事務開始之前的狀態(rollback),以確保不會停留在錯誤的中間狀態。下面的程式碼演示了 MySQL 典型的事務回滾應用。

>>> import pymysql
>>> db = pymysql.connect(
  host = 'localhost',charset = 'utf8'
)

def transaction(db):
  try:
    db.begin()
    # 此處加入出錯之後需要回滾的DML(insert、update、delete)語句
    db.commit()
    return True
  except:
    db.rollback()
    return False  

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。