在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ Python+MySQL數(shù)據(jù)庫操作(PyMySQL)
Python異常處理
Python循環(huán)
Python基本運(yùn)算符
Python網(wǎng)絡(luò)編程(Sockets)
Python可以開發(fā)哪些程序?
Python XML解析和處理
Python數(shù)字
Python函數(shù)
Python變量類型
Python os模塊方法
Python迭代器
Python安裝和環(huán)境配置
Python構(gòu)造函數(shù)
Python文件對象方法
Python日期和時間
Python的歷史
Python生成器
Python+MySQL數(shù)據(jù)庫操作(PyMySQL)
Python命令行參數(shù)
Python元組
Python發(fā)送郵件
Python列表
Python文件讀寫
Python教程
Python面向?qū)ο螅惡蛯ο螅?/span>
Python多線程編程
Python多重繼承
Python決策
Python是什么?
Python快速入門
Python繼承
Python字典
Python字符串
Python操作符重載
Python正則表達(dá)式
Python閉包
Python修飾器
Python功能特點
Python模塊

Python+MySQL數(shù)據(jù)庫操作(PyMySQL)

Python的數(shù)據(jù)庫接口標(biāo)準(zhǔn)是Python DB-API。大多數(shù)Python數(shù)據(jù)庫接口遵循這個標(biāo)準(zhǔn)。
可以為應(yīng)用程序選擇正確的數(shù)據(jù)庫。Python數(shù)據(jù)庫API支持廣泛的數(shù)據(jù)庫服務(wù)器,如 -

以下是可用的Python數(shù)據(jù)庫接口 - Python數(shù)據(jù)庫接口和API的列表。需要為要訪問的每種數(shù)據(jù)庫下載一個單獨的DB API模塊。 例如,如果需要訪問Oracle數(shù)據(jù)庫和MySQL數(shù)據(jù)庫,則必須同時下載Oracle和MySQL數(shù)據(jù)庫模塊。

DB API為盡可能使用Python結(jié)構(gòu)和語法處理數(shù)據(jù)庫提供了最低標(biāo)準(zhǔn)。API包括以下內(nèi)容:

  • 導(dǎo)入API模塊。
  • 獲取與數(shù)據(jù)庫的連接。
  • 發(fā)出SQL語句和存儲過程。
  • 關(guān)閉連接

Python具有內(nèi)置的SQLite支持。 在本節(jié)中,我們將學(xué)習(xí)使用MySQL的相關(guān)概念和知識。 在早期Python版本一般都使用MySQLdb模塊,但這個MySQL的流行接口與Python 3不兼容。因此,在教程中將使用PyMySQL模塊。

1.什么是PyMySQL?

PyMySQL是從Python連接到MySQL數(shù)據(jù)庫服務(wù)器的接口。 它實現(xiàn)了Python數(shù)據(jù)庫API v2.0,并包含一個純Python的MySQL客戶端庫。 PyMySQL的目標(biāo)是成為MySQLdb的替代品。

PyMySQL參考文檔:http://pymysql.readthedocs.io/

2.如何安裝PyMySQL?

在使用PyMySQL之前,請確保您的機(jī)器上安裝了PyMySQL。只需在Python腳本中輸入以下內(nèi)容即可執(zhí)行它 -

#!/usr/bin/python3

import PyMySQL

在 Windows 系統(tǒng)上,打開命令提示符 -

C:\Users\Administrator>python
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import PyMySQL
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'PyMySQL'
>>>

如果產(chǎn)生如上結(jié)果,則表示PyMySQL模塊尚未安裝。

最后一個穩(wěn)定版本可以在PyPI上使用,可以通過pip命令來安裝-

:\Users\Administrator> pip install PyMySQL
Collecting PyMySQL
  Downloading PyMySQL-0.7.11-py2.py3-none-any.whl (78kB)
    51% |████████████████▋               | 
    40kB 109kB/s eta 0:0    64% |████████████████████▊       
    | 51kB 112kB/s eta    77% |█████████████████████████      | 61kB 135kB/s    90% |█████████████████████████████
    | 71kB 152    100% |████████████████████████████████| 81kB 163kB/s

Installing collected packages: PyMySQL
Successfully installed PyMySQL-0.7.11

C:\Users\Administrator>

或者(例如,如果pip不可用),可以從GitHub下載tarball,并按照以下方式安裝:

$ # X.X is the desired PyMySQL version (e.g. 0.5 or 0.6).
$ curl -L http://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz
$ cd PyMySQL*
$ python setup.py install
$ # The folder PyMySQL* can be safely removed now.

注意 - 確保具有root權(quán)限來安裝上述模塊。

3.數(shù)據(jù)庫連接

在連接到MySQL數(shù)據(jù)庫之前,請確保以下幾點:

  • 已經(jīng)創(chuàng)建了一個數(shù)據(jù)庫:test。
  • 已經(jīng)在test中創(chuàng)建了一個表:employee
  • employee表格包含:fist_name,last_nameage,sexincome字段。
  • MySQL用戶“root”和密碼“123456”可以訪問:test。
  • Python模塊PyMySQL已正確安裝在您的計算機(jī)上。
  • 已經(jīng)通過MySQL教程了解MySQL基礎(chǔ)知識。

創(chuàng)建表employee的語句為:

CREATE TABLE `employee` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `first_name` char(20) NOT NULL,
  `last_name` char(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `income` float DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

實例

以下是Python通過PyMySQL模塊接口連接MySQL數(shù)據(jù)庫“test”的示例 -

注意:在 Windows 系統(tǒng)上,import PyMySQLimport pymysql 有區(qū)別。

#!/usr/bin/python3
#coding=utf-8

import pymysql

# Open database connection
db = pymysql.connect("localhost","root","123456","test" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# execute SQL query using execute() method.
cursor.execute("SELECT VERSION()")

# Fetch a single row using fetchone() method.
data = cursor.fetchone()

print ("Database version : %s " % data)

# disconnect from server
db.close()

運(yùn)行此腳本時,會產(chǎn)生以下結(jié)果 -

Database version : 5.7.14-log

如果使用數(shù)據(jù)源建立連接,則會返回連接對象并將其保存到db中以供進(jìn)一步使用,否則將db設(shè)置為None。 接下來,db對象用于創(chuàng)建一個游標(biāo)對象,用于執(zhí)行SQL查詢。 最后,在結(jié)果打印出來之前,它確保數(shù)據(jù)庫連接關(guān)閉并釋放資源。

4.創(chuàng)建數(shù)據(jù)庫表

建立數(shù)據(jù)庫連接后,可以使用創(chuàng)建的游標(biāo)的execute方法將數(shù)據(jù)庫表或記錄創(chuàng)建到數(shù)據(jù)庫表中。

示例

下面演示如何在數(shù)據(jù)庫:test中創(chuàng)建一張數(shù)據(jù)庫表:employee -

#!/usr/bin/python3
#coding=utf-8

import pymysql

# Open database connection
db = pymysql.connect("localhost","root","123456","test" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS employee")

# Create table as per requirement
sql = """CREATE TABLE `employee` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `first_name` char(20) NOT NULL,
  `last_name` char(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `income` float DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;"""

cursor.execute(sql)
print("Created table Successfull.")
# disconnect from server
db.close()

運(yùn)行此腳本時,會產(chǎn)生以下結(jié)果 -

Created table Successfull.

5.插入操作

當(dāng)要將記錄創(chuàng)建到數(shù)據(jù)庫表中時,需要執(zhí)行INSERT操作。

示例

以下示例執(zhí)行SQL的INSERT語句以在EMPLOYEE表中創(chuàng)建一條(多條)記錄 -

#!/usr/bin/python3
#coding=utf-8

import pymysql

# Open database connection
db = pymysql.connect("localhost","root","123456","test" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
   LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Mac', 'Su', 20, 'M', 5000)"""
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

## 再次插入一條記錄
# Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
   LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Kobe', 'Bryant', 40, 'M', 8000)"""
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()
print (sql)
print('Yes, Insert Successfull.')
# disconnect from server
db.close()

運(yùn)行此腳本時,會產(chǎn)生以下結(jié)果 -

Yes, Insert Successfull.

上述插入示例可以寫成如下動態(tài)創(chuàng)建SQL查詢 -

#!/usr/bin/python3
#coding=utf-8

import pymysql

# Open database connection
db = pymysql.connect("localhost","root","123456","test" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
   LAST_NAME, AGE, SEX, INCOME) \
   VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
   ('Max', 'Su', 25, 'F', 2800)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

示例

以下代碼段是另一種執(zhí)行方式,可以直接傳遞參數(shù) -

..................................
user_id = "test123"
password = "password"

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

6.讀取操作

任何數(shù)據(jù)庫上的讀操作表示要從數(shù)據(jù)庫中讀取獲取一些有用的信息。

在建立數(shù)據(jù)庫連接后,就可以對此數(shù)據(jù)庫進(jìn)行查詢了。 可以使用fetchone()方法獲取單條記錄或fetchall()方法從數(shù)據(jù)庫表中獲取多個值。

  • fetchone() - 它獲取查詢結(jié)果集的下一行。 結(jié)果集是當(dāng)使用游標(biāo)對象來查詢表時返回的對象。

  • fetchall() - 它獲取結(jié)果集中的所有行。 如果已經(jīng)從結(jié)果集中提取了一些行,則從結(jié)果集中檢索剩余的行。

  • rowcount - 這是一個只讀屬性,并返回受execute()方法影響的行數(shù)。

示例

以下過程查詢EMPLOYEE表中所有記錄的工資超過1000員工記錄信息 -

#!/usr/bin/python3
#coding=utf-8

import pymysql

# Open database connection
db = pymysql.connect("localhost","root","123456","test" )

# prepare a cursor object using cursor() method
cursor = db.cursor()
# 按字典返回 
# cursor = db.cursor(pymysql.cursors.DictCursor)

# Prepare SQL query to select a record from the table.
sql = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > %d" % (1000)
#print (sql)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Fetch all the rows in a list of lists.
   results = cursor.fetchall()
   for row in results:
      #print (row)
      fname = row[1]
      lname = row[2]
      age = row[3]
      sex = row[4]
      income = row[5]
      # Now print fetched result
      print ("name = %s %s,age = %s,sex = %s,income = %s" % \
             (fname, lname, age, sex, income ))
except:
   import traceback
   traceback.print_exc()

   print ("Error: unable to fetch data")

# disconnect from server
db.close()
name = Mac Su,age = 20,sex = M,income = 5000.0
name = Kobe Bryant,age = 40,sex = M,income = 8000.0

7.更新操作

UPDATE語句可對任何數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行更新操作,它可用于更新數(shù)據(jù)庫中已有的一個或多個記錄。

以下程序?qū)⑺?code>SEX字段的值為“M”的記錄的年齡(age字段)更新為增加一年。

#!/usr/bin/python3
#coding=utf-8

import pymysql

# Open database connection
db = pymysql.connect("localhost","root","123456","test" )

# prepare a cursor object using cursor() method
#cursor = db.cursor()
cursor = db.cursor(pymysql.cursors.DictCursor)
# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to UPDATE required records
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 \
                          WHERE SEX = '%c'" % ('M')
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

8.刪除操作

當(dāng)要從數(shù)據(jù)庫中刪除一些記錄時,那么可以執(zhí)行DELETE操作。 以下是刪除EMPLOYEEAGE超過40的所有記錄的程序 -

#!/usr/bin/python3
#coding=utf-8

import pymysql

# Open database connection
db = pymysql.connect("localhost","root","123456","test" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (40)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

9.執(zhí)行事務(wù)

事務(wù)是確保數(shù)據(jù)一致性的一種機(jī)制。事務(wù)具有以下四個屬性 -

  • 原子性 - 事務(wù)要么完成,要么完全沒有發(fā)生。
  • 一致性 - 事務(wù)必須以一致的狀態(tài)開始,并使系統(tǒng)保持一致狀態(tài)。
  • 隔離性 - 事務(wù)的中間結(jié)果在當(dāng)前事務(wù)外部不可見。
  • 持久性 - 當(dāng)提交了一個事務(wù),即使系統(tǒng)出現(xiàn)故障,效果也是持久的。

Python DB API 2.0提供了兩種提交或回滾事務(wù)的方法。

示例

已經(jīng)知道如何執(zhí)行事務(wù)。 這是一個類似的例子 -

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

9.1.COMMIT操作

提交是一種操作,它向數(shù)據(jù)庫發(fā)出信號以完成更改,并且在此操作之后,不會更改任何更改。

下面是一個簡單的例子演示如何調(diào)用commit()方法。

db.commit()

9.2.回滾操作

如果您對一個或多個更改不滿意,并且要完全還原這些更改,請使用rollback()方法。

下面是一個簡單的例子演示如何調(diào)用rollback()方法。

db.rollback()

10.斷開數(shù)據(jù)庫連接

要斷開數(shù)據(jù)庫連接,請使用close()方法。

db.close()

如果用戶使用close()方法關(guān)閉與數(shù)據(jù)庫的連接,則任何未完成的事務(wù)都將被數(shù)據(jù)庫回滾。 但是,您的應(yīng)用程序不會依賴于數(shù)據(jù)級別的實現(xiàn)細(xì)節(jié),而是明確地調(diào)用提交或回滾。

11.處理錯誤

錯誤有很多來源。一些示例是執(zhí)行的SQL語句中的語法錯誤,連接失敗或為已取消或已完成語句句柄調(diào)用fetch方法等等。

DB API定義了每個數(shù)據(jù)庫模塊中必須存在的許多錯誤。下表列出了這些異常和錯誤 -

編號 異常 描述
1 Warning 用于非致命問題,是StandardError的子類。
2 Error 錯誤的基類,是StandardError的子類。
3 InterfaceError 用于數(shù)據(jù)庫模塊中的錯誤,但不是數(shù)據(jù)庫本身,是Error的子類。
4 DatabaseError 用于數(shù)據(jù)庫中的錯誤,是Error的子類。
5 DataError DatabaseError的子類引用數(shù)據(jù)中的錯誤。
6 OperationalError DatabaseError的子類,涉及如丟失與數(shù)據(jù)庫的連接等錯誤。 這些錯誤通常不在Python腳本程序的控制之內(nèi)。
7 IntegrityError DatabaseError 子類錯誤,可能會損害關(guān)系完整性,例如唯一性約束和外鍵。
8 InternalError DatabaseError的子類,指的是數(shù)據(jù)庫模塊內(nèi)部的錯誤,例如游標(biāo)不再活動。
9 ProgrammingError DatabaseError的子類,它引用錯誤,如錯誤的表名和其他安全。
10 NotSupportedError DatabaseError的子類,用于嘗試調(diào)用不支持的功能。

Python腳本應(yīng)該處理這些錯誤,但在使用任何上述異常之前,請確保您的PyMySQL支持該異常。 可以通過閱讀DB API 2.0規(guī)范獲得更多關(guān)于它們的信息。


上一篇:Python多重繼承下一篇:Python字符串