1. 程式人生 > >Python3 MySQL 數據庫連接

Python3 MySQL 數據庫連接

字段 curl 找到 employee not commit pip cap .org

什麽是 PyMySQL?

PyMySQL 是在 Python3.x 版本中用於連接 MySQL 服務器的一個庫,Python2中則使用mysqldb。

PyMySQL 遵循 Python 數據庫 API v2.0 規範,並包含了 pure-Python MySQL 客戶端庫。

PyMySQL 安裝

在使用 PyMySQL 之前,我們需要確保 PyMySQL 已安裝。

PyMySQL 下載地址:https://github.com/PyMySQL/PyMySQL。

如果還未安裝,我們可以使用以下命令安裝最新版的 PyMySQL:

$ pip install PyMySQL

  

如果你的系統不支持 pip 命令,可以使用以下方式安裝:

1、使用 git 命令下載安裝包安裝(你也可以手動下載):

$ git clone https://github.com/PyMySQL/PyMySQL
$ cd PyMySQL/
$ python3 setup.py install

  

2、如果需要制定版本號,可以使用 curl 命令來安裝:

$ # X.X 為 PyMySQL 的版本號
$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz
$ cd PyMySQL*
$ python3 setup.py install
$ # 現在你可以刪除 PyMySQL* 目錄

  

註意:請確保您有root權限來安裝上述模塊。

安裝的過程中可能會出現"ImportError: No module named setuptools"的錯誤提示,意思是你沒有安裝setuptools,你可以訪問https://pypi.python.org/pypi/setuptools 找到各個系統的安裝方法。

Linux 系統安裝實例:

$ wget https://bootstrap.pypa.io/ez_setup.py
$ python3 ez_setup.py

  

數據庫連接

連接數據庫前,請先確認以下事項:

  • 您已經創建了數據庫 TESTDB.
  • 在TESTDB數據庫中您已經創建了表 EMPLOYEE
  • EMPLOYEE表字段為 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。
  • 連接數據庫TESTDB使用的用戶名為 "testuser" ,密碼為 "test123",你可以可以自己設定或者直接使用root用戶名及其密碼,Mysql數據庫用戶授權請使用Grant命令。
  • 在你的機子上已經安裝了 Python MySQLdb 模塊。

實例:

以下實例鏈接 Mysql 的 TESTDB 數據庫

#!/usr/bin/python3
 
import pymysql
 
# 打開數據庫連接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用 cursor() 方法創建一個遊標對象 cursor
cursor = db.cursor()
 
# 使用 execute()  方法執行 SQL 查詢 
cursor.execute("SELECT VERSION()")
 
# 使用 fetchone() 方法獲取單條數據.
data = cursor.fetchone()
 
print ("Database version : %s " % data)
 
# 關閉數據庫連接
db.close()

  

執行以上腳本輸出結果如下:

Database version : 5.5.20-log

  

創建數據庫表

如果數據庫連接存在我們可以使用execute()方法來為數據庫創建表,如下所示創建表EMPLOYEE:

#!/usr/bin/python3
 
import pymysql
 
# 打開數據庫連接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用 cursor() 方法創建一個遊標對象 cursor
cursor = db.cursor()
 
# 使用 execute() 方法執行 SQL,如果表存在則刪除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
 
# 使用預處理語句創建表
sql = """CREATE TABLE EMPLOYEE (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )"""
 
cursor.execute(sql)
 
# 關閉數據庫連接
db.close()

  

數據庫插入操作

以下實例使用執行 SQL INSERT 語句向表 EMPLOYEE 插入記錄:

#!/usr/bin/python3
 
import pymysql
 
# 打開數據庫連接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用cursor()方法獲取操作遊標 
cursor = db.cursor()
 
# SQL 插入語句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES (‘Mac‘, ‘Mohan‘, 20, ‘M‘, 2000)"""
try:
   # 執行sql語句
   cursor.execute(sql)
   # 提交到數據庫執行
   db.commit()
except:
   # 如果發生錯誤則回滾
   db.rollback()
 
# 關閉數據庫連接
db.close()

  

以上例子也可以寫成如下形式:

#!/usr/bin/python3
 
import pymysql
 
# 打開數據庫連接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用cursor()方法獲取操作遊標 
cursor = db.cursor()
 
# SQL 插入語句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME,        LAST_NAME, AGE, SEX, INCOME)        VALUES (‘%s‘, ‘%s‘, ‘%d‘, ‘%c‘, ‘%d‘ )" %        (‘Mac‘, ‘Mohan‘, 20, ‘M‘, 2000)
try:
   # 執行sql語句
   cursor.execute(sql)
   # 執行sql語句
   db.commit()
except:
   # 發生錯誤時回滾
   db.rollback()
 
# 關閉數據庫連接
db.close()

  

以下代碼使用變量向SQL語句中傳遞參數:

user_id = "test123"
password = "password"

con.execute(‘insert into Login values("%s", "%s")‘ %              (user_id, password))

  

數據庫查詢操作

Python查詢Mysql使用 fetchone() 方法獲取單條數據, 使用fetchall() 方法獲取多條數據。

  • fetchone(): 該方法獲取下一個查詢結果集。結果集是一個對象
  • fetchall(): 接收全部的返回結果行.
  • rowcount: 這是一個只讀屬性,並返回執行execute()方法後影響的行數。

實例:

查詢EMPLOYEE表中salary(工資)字段大於1000的所有數據:

#!/usr/bin/python3
 
import pymysql
 
# 打開數據庫連接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用cursor()方法獲取操作遊標 
cursor = db.cursor()
 
# SQL 查詢語句
sql = "SELECT * FROM EMPLOYEE        WHERE INCOME > ‘%d‘" % (1000)
try:
   # 執行SQL語句
   cursor.execute(sql)
   # 獲取所有記錄列表
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
       # 打印結果
      print ("fname=%s,lname=%s,age=%d,sex=%s,income=%d" %              (fname, lname, age, sex, income ))
except:
   print ("Error: unable to fetch data")
 
# 關閉數據庫連接
db.close()

  

以上腳本執行結果如下:

fname=Mac, lname=Mohan, age=20, sex=M, income=2000

  

數據庫更新操作

更新操作用於更新數據表的的數據,以下實例將 TESTDB表中的 SEX 字段全部修改為 ‘M‘,AGE 字段遞增1:

#!/usr/bin/python3
 
import pymysql
 
# 打開數據庫連接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用cursor()方法獲取操作遊標 
cursor = db.cursor()
 
# SQL 更新語句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = ‘%c‘" % (‘M‘)
try:
   # 執行SQL語句
   cursor.execute(sql)
   # 提交到數據庫執行
   db.commit()
except:
   # 發生錯誤時回滾
   db.rollback()
 
# 關閉數據庫連接
db.close()

  

刪除操作

刪除操作用於刪除數據表中的數據,以下實例演示了刪除數據表 EMPLOYEE 中 AGE 大於 20 的所有數據:

#!/usr/bin/python3
 
import pymysql
 
# 打開數據庫連接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用cursor()方法獲取操作遊標 
cursor = db.cursor()
 
# SQL 刪除語句
sql = "DELETE FROM EMPLOYEE WHERE AGE > ‘%d‘" % (20)
try:
   # 執行SQL語句
   cursor.execute(sql)
   # 提交修改
   db.commit()
except:
   # 發生錯誤時回滾
   db.rollback()
 
# 關閉連接
db.close()

  

執行事務

事務機制可以確保數據一致性。

事務應該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為ACID特性。

  • 原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要麽都做,要麽都不做。
  • 一致性(consistency)。事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
  • 隔離性(isolation)。一個事務的執行不能被其他事務幹擾。即一個事務內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相幹擾。
  • 持久性(durability)。持續性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

Python DB API 2.0 的事務提供了兩個方法 commit 或 rollback。

實例

# SQL刪除記錄語句
sql = "DELETE FROM EMPLOYEE WHERE AGE > ‘%d‘" % (20)
try:
   # 執行SQL語句
   cursor.execute(sql)
   # 向數據庫提交
   db.commit()
except:
   # 發生錯誤時回滾
   db.rollback()

  

對於支持事務的數據庫, 在Python數據庫編程中,當遊標建立之時,就自動開始了一個隱形的數據庫事務。

commit()方法遊標的所有更新操作,rollback()方法回滾當前遊標的所有操作。每一個方法都開始了一個新的事務。

錯誤處理

DB API中定義了一些數據庫操作的錯誤及異常,下表列出了這些錯誤和異常:

異常描述
Warning 當有嚴重警告時觸發,例如插入數據是被截斷等等。必須是 StandardError 的子類。
Error 警告以外所有其他錯誤類。必須是 StandardError 的子類。
InterfaceError 當有數據庫接口模塊本身的錯誤(而不是數據庫的錯誤)發生時觸發。 必須是Error的子類。
DatabaseError 和數據庫有關的錯誤發生時觸發。 必須是Error的子類。
DataError 當有數據處理時的錯誤發生時觸發,例如:除零錯誤,數據超範圍等等。 必須是DatabaseError的子類。
OperationalError 指非用戶控制的,而是操作數據庫時發生的錯誤。例如:連接意外斷開、 數據庫名未找到、事務處理失敗、內存分配錯誤等等操作數據庫是發生的錯誤。 必須是DatabaseError的子類。
IntegrityError 完整性相關的錯誤,例如外鍵檢查失敗等。必須是DatabaseError子類。
InternalError 數據庫的內部錯誤,例如遊標(cursor)失效了、事務同步失敗等等。 必須是DatabaseError子類。
ProgrammingError 程序錯誤,例如數據表(table)沒找到或已存在、SQL語句語法錯誤、 參數數量錯誤等等。必須是DatabaseError的子類。
NotSupportedError 不支持錯誤,指使用了數據庫不支持的函數或API等。例如在連接對象上 使用.rollback()函數,然而數據庫並不支持事務或者事務已關閉。 必須是DatabaseError的子類。

Python3 MySQL 數據庫連接