Python的數據庫接口標準是Python DB-API。大多數Python數據庫接口遵循這個標準。 能夠爲應用程序選擇正確的數據庫。Python數據庫API支持普遍的數據庫服務器,如 -python
如下是可用的Python數據庫接口 - Python數據庫接口和API的列表。必須爲須要訪問的每一個數據庫下載一個單獨的DB API模塊。 例如,若是須要訪問Oracle數據庫和MySQL數據庫,則必須同時下載Oracle和MySQL數據庫模塊。mysql
DB API爲儘量使用Python結構和語法處理數據庫提供了最低標準。API包括如下內容:git
Python具備內置的SQLite支持。 在本節中,咱們將學習使用MySQL的相關概念和知識。 在早期Python版本通常都使用MySQLdb模塊,但這個MySQL的流行接口與Python 3不兼容。所以,在教程中將使用PyMySQL模塊。github
PyMySQL是從Python鏈接到MySQL數據庫服務器的接口。 它實現了Python數據庫API v2.0,幷包含一個純Python的MySQL客戶端庫。 PyMySQL的目標是成爲MySQLdb的替代品。sql
PyMySQL參考文檔:http://pymysql.readthedocs.io/shell
在使用PyMySQL以前,請確保您的機器上安裝了PyMySQL。只需在Python腳本中輸入如下內容便可執行它 -數據庫
#!/usr/bin/python3 import PyMySQL
在 Windows 系統上,打開命令提示符 -安全
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' >>>
若是產生如上結果,則表示MySQLdb模塊還沒有安裝。服務器
最後一個穩定版本能夠在PyPI上使用,能夠經過pip
命令來安裝-oracle
:\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權限來安裝上述模塊。
在鏈接到MySQL數據庫以前,請確保如下幾點:
test
。test
中建立了一個表:employee
。employee
表格包含:fist_name
,last_name
,age
,sex
和income
字段。test
。建立表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數據庫「test
」的示例 -
注意:在 Windows 系統上,
import PyMySQL
和import pymysql
有區別。
#!/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()
運行此腳本時,會產生如下結果 -
Database version : 5.7.14-log
若是使用數據源創建鏈接,則會返回鏈接對象並將其保存到db
中以供進一步使用,不然將db
設置爲None
。 接下來,db
對象用於建立一個遊標對象,用於執行SQL查詢。 最後,在結果打印出來以前,它確保數據庫鏈接關閉並釋放資源。
創建數據庫鏈接後,可使用建立的遊標的execute
方法將數據庫表或記錄建立到數據庫表中。
示例
下面演示如何在數據庫:test
中建立一張數據庫表: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()
運行此腳本時,會產生如下結果 -
Created table Successfull.
當要將記錄建立到數據庫表中時,須要執行INSERT
操做。
示例
如下示例執行SQL的INSERT
語句以在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() # 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()
運行此腳本時,會產生如下結果 -
Yes, Insert Successfull.
上述插入示例能夠寫成以下動態建立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()
示例
如下代碼段是另外一種執行方式,能夠直接傳遞參數 -
.................................. user_id = "test123" password = "password" con.execute('insert into Login values("%s", "%s")' % \ (user_id, password)) ..................................
任何數據庫上的讀操做表示要從數據庫中讀取獲取一些有用的信息。
在創建數據庫鏈接後,就能夠對此數據庫進行查詢了。 可使用fetchone()
方法獲取單條記錄或fetchall()
方法從數據庫表中獲取多個值。
fetchone()
- 它獲取查詢結果集的下一行。 結果集是當使用遊標對象來查詢表時返回的對象。
fetchall()
- 它獲取結果集中的全部行。 若是已經從結果集中提取了一些行,則從結果集中檢索剩餘的行。
rowcount
- 這是一個只讀屬性,並返回受execute()
方法影響的行數。
示例
如下過程查詢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
UPDATE語句可對任何數據庫中的數據進行更新操做,它可用於更新數據庫中已有的一個或多個記錄。
如下程序將全部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()
當要從數據庫中刪除一些記錄時,那麼能夠執行DELETE
操做。 如下是刪除EMPLOYEE
中AGE
超過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()
事務是確保數據一致性的一種機制。事務具備如下四個屬性 -
Python DB API 2.0提供了兩種提交或回滾事務的方法。
示例
已經知道如何執行事務。 這是一個相似的例子 -
# 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()
提交是一種操做,它向數據庫發出信號以完成更改,而且在此操做以後,不會更改任何更改。
下面是一個簡單的例子演示如何調用commit()
方法。
db.commit()
若是您對一個或多個更改不滿意,而且要徹底還原這些更改,請使用rollback()
方法。
下面是一個簡單的例子演示如何調用rollback()
方法。
db.rollback()
要斷開數據庫鏈接,請使用close()
方法。
db.close()
若是用戶使用close()
方法關閉與數據庫的鏈接,則任何未完成的事務都將被數據庫回滾。 可是,您的應用程序不會依賴於數據級別的實現細節,而是明確地調用提交或回滾。
錯誤有不少來源。一些示例是執行的SQL語句中的語法錯誤,鏈接失敗或爲已取消或已完成語句句柄調用fetch
方法等等。
DB API定義了每一個數據庫模塊中必須存在的許多錯誤。下表列出了這些異常和錯誤 -
編號 | 異常 | 描述 |
---|---|---|
1 | Warning | 用於非致命問題,是StandardError的子類。 |
2 | Error | 錯誤的基類,是StandardError的子類。 |
3 | InterfaceError | 用於數據庫模塊中的錯誤,但不是數據庫自己,是Error的子類。 |
4 | DatabaseError | 用於數據庫中的錯誤,是Error的子類。 |
5 | DataError | DatabaseError的子類引用數據中的錯誤。 |
6 | OperationalError | DatabaseError的子類,涉及如丟失與數據庫的鏈接等錯誤。 這些錯誤一般不在Python腳本程序的控制以內。 |
7 | IntegrityError | *DatabaseError *子類錯誤,可能會損害關係完整性,例如惟一性約束和外鍵。 |
8 | InternalError | DatabaseError的子類,指的是數據庫模塊內部的錯誤,例如遊標再也不活動。 |
9 | ProgrammingError | DatabaseError的子類,它引用錯誤,如錯誤的表名和其餘安全。 |
10 | NotSupportedError | DatabaseError的子類,用於嘗試調用不支持的功能。 |
Python腳本應該處理這些錯誤,但在使用任何上述異常以前,請確保您的PyMySQL支持該異常。 能夠經過閱讀DB API 2.0規範得到更多關於它們的信息。