這里僅介紹 MySQL 官方開發的 Python 接口,參見這里:
https://dev.mysql.com/doc/connector-python/en/
Chapter 1 Introduction to MySQL Connector/Python
這個接口是用純Python寫成的,僅依賴 Python Standard Library。
MySQL Connector/Python 支持以下幾點:
1、MySQL Server 版本到 5.7 及 5.7 版本的幾乎所有特性;
2、支持Python 和 MySQL 參數的數據類型之間的雙向轉換,例如 Python 的 datetime 和 MySQL 的 DATETIME;
3、MySQL 對標准的SQL語法的所有的拓展;
4、協議壓縮,這使得客戶端和服務器之間的數據流被壓縮了;
5、使用 TCP/IP sockets 建立鏈接,在 Unix 平台使用 Unix sockets 建立鏈接;
6、使用 SSL 建立安全的 TCP/IP 鏈接;
7、自包含驅動程序。意味着 Connector/Python 在 Python 標准庫之外不需要 MySQL 客戶端庫程序或者任何 Python 模塊。
Chapter 2 Guidelines for Python Developers
如下的設計指南覆蓋了開發 MySQL 應用程序的各個方面,可能對於有Python背景的開發人員來說不是那么明顯。
1、出於安全性考慮,不要把連接、登錄到數據庫中的值硬編碼到主腳本文件中。Python 有一個 config.py 模塊的習俗,你可以把這些值保存到這里;
2、受到可以使用的RAM的限制,Python 腳本經常在內存中構建和拆解大的數據結構。因為MySQL經常處理好幾倍大於可用內存的數據集合,能優化存儲空間和磁盤I/O的技術是尤其重要的。例如,在MySQL 表格中,往往使用數值型IDs而不是基於字符串的詞典關鍵值,因此鍵值是緊湊的並且長度是可以預料的。對於那些構成InnoDB表格中的Primary Key 的列,這一點是尤為重要的,因為這些列值使用第二索引值復制的;
3、所有接受輸入的應用程序必須處理壞的數據:
壞的數據可能是意外的,例如值超出范圍,或者字符串格式錯誤。應用程序可以使用服務器端的例如 unique constraints 和 NOT NULL constraints 的檢查,來保證壞的數據放到數據庫中。在客戶端,使用異常檢查來報告任何的問題並且采取糾正措施。
壞的數據也可能是蓄意的,典型的代表是SQL注入攻擊。例如,輸入值允許引號,分號,“%” 和下划線通配符字符等其他的在SQL語句中有特殊意義的字符。驗證輸入值確保他們只有預期的字符。當把字符插入到SQL語句中轉義任何可能導致故意的行為的字符。在未經驗證和轉義之前,永遠不要把用戶輸入的字符串插入到SQL語句中。即便是接收其他應用程序產生的字符串,期待其他的應用程序可能已經讓步,傳遞給你不正確的或者有害的數據。
4、因為SQL查詢語句的結果集合可能非常的大,使用合適的方法在循環中遍歷得到結果值。當你知道結果集合只有一行,fetchone() 返回一個項目;當你知道結果結合有有限的行並且能夠輕而易舉地放到內存中, fetchall() 返回所有的項目。當你不能決定結果集合的大小時,fetchmany() 通用方法,在循環中調用它知道結果結合沒有更多的值。
5、由於Python已經有非常方便的模塊例如 pickle 和 cPickle 用來讀取磁盤上的數據結構,相反的你選來保存到MySQL中的數據很有可能有特殊的特征:
1)太大以至於不能同時加載到內存中。使用 SELECT 語句來查詢你需要的精確的項目,使用聚合函數在多個項目上做計算。在 MySQL 服務器上使用選項 innodb_buffer_pool_size 來控制緩存查詢結果占用的RAM總容量。
2)太復雜以至於不能使用一個單一的數據結構來表達。把數據拆分到不同的表格中。在查詢語句中使用 join 關鍵字來組個多個表格。使用 foreign key 來包保證不同表格之間的同步關系。
3)更新太頻繁,有可能是多個用戶同時使用。更新可能只是影響數據的一小部分,但是每一次都要重寫整個數據機構就很浪費。使用 INSERT, UPDATE, DELETE 語句並行地更新不同的項目,只把有改變的值寫到磁盤中。使用 InnoDB 表格和事務來保證寫操作不會互相沖突,並且保證查詢語句返回的結果的一致性,即便底層數據被更新了。
6、使用 MySQL 性能最好的慣例,能夠幫助你的應用程序在不需要重大的重寫或者架構調整的情況下裁剪。它提供了SQL微調,設局庫設計,服務器配置的准則和小提示。
7、沒有必要重造輪子,使用 MySQL 的 SQL 語句做常用操作:查詢中的操作符,成批導入數據的技巧,等等。有一些語句和自居是對SQL標准的擴展。
8、在Python中發起SQL語句可能用到非常長的有可能是多行的字符串。因為SQL語句中的字符串字面值可能用單引號括雙引號或者其中之一的括起來,為了簡便,可以使用Python的3引號機智來包裹SQL語句,例如:
"""It doesn't matter if this string contains 'single'
or "double" quotes, as long as there are't 3 in a
row."""
9、快速的,可擴展的 MySQL 應用程序秘訣之一,就是在設計階段最開始的使用 CREATE TABLE 語句中使用了正確的語法。例如 Oracle 推薦大多數的表格使用 ENGINE=INNODB 字句,並且從 MySQL5.5 及以上版本中都用 InnoDB 作為默認的存儲引擎。另外一個推薦值就是每個表格使用數值型的 primary key 。
下一篇講實際操作。