MySQL Connector/Python 開發人員指南  /  給 Python 開發人員的指南

第 2 章 給 Python 開發人員的指南

以下指南涵蓋了開發 MySQL 應用程式時,對於來自 Python 背景的開發人員來說可能不那麼顯而易見的方面

  • 為了安全起見,請勿在您的主要腳本中硬式編碼連線和登入資料庫所需的值。Python 有一個 config.py 模組的慣例,您可以在其中將這些值與程式碼的其他部分分開。

  • Python 腳本通常會在記憶體中建立和拆解大型資料結構,直到可用 RAM 的限制。由於 MySQL 通常處理的資料集比可用記憶體大得多,因此優化儲存空間和磁碟 I/O 的技術尤其重要。例如,在 MySQL 資料表中,您通常會使用數值 ID 而非基於字串的字典鍵,以便索引鍵值緊湊且長度可預測。這對於構成 主要索引鍵 的欄位尤其重要,因為這些欄位值會複製在每個 次要索引 中。

  • 任何接受輸入的應用程式都必須預期處理錯誤的資料。

    錯誤的資料可能是意外的,例如超出範圍的值或格式錯誤的字串。應用程式可以使用伺服器端檢查,例如 唯一約束NOT NULL 約束,以防止錯誤的資料進入資料庫。在用戶端,請使用例外處理程式等技術來報告任何問題並採取糾正措施。

    錯誤的資料也可能是故意的,代表 SQL 注入攻擊。例如,輸入值可能包含引號、分號、%_ 通配符號以及在 SQL 語句中具有意義的其他字元。驗證輸入值以確保它們僅具有預期的字元。逸出任何可能在代入 SQL 語句時更改預期行為的特殊字元。在未先進行驗證和逸出的情況下,切勿將使用者輸入值串連到 SQL 語句中。即使接受其他程式產生的輸入,也要預期其他程式也可能已受損,並且正在向您傳送不正確或惡意的資料。

  • 由於 SQL 查詢的結果集可能非常大,請使用適當的方法在您迴圈處理結果集時擷取其中的項目。fetchone() 在您知道結果集包含單列時,擷取單一項目。fetchall() 在您知道結果集包含可以舒適地放入記憶體的有限列數時,擷取所有項目。fetchmany() 是在您無法預測結果集大小時的通用方法:您會不斷呼叫它並迴圈處理傳回的項目,直到沒有更多結果要處理。

  • 由於 Python 已經有方便的模組(例如 picklecPickle)可在磁碟上讀寫資料結構,因此您選擇改為儲存在 MySQL 中的資料可能具有特殊特性

    • 太大而無法一次全部放入記憶體中。 您可以使用 SELECT 語句僅查詢您需要的精確項目,並使用 彙總函數 對多個項目執行計算。您可以設定 MySQL 伺服器中的 innodb_buffer_pool_size 選項,以將一定量的 RAM 專用於快取資料表和索引資料。

    • 太複雜而無法以單一資料結構表示。 您可以將資料劃分到不同的 SQL 資料表中。您可以使用 聯結 查詢重新組合來自多個資料表的資料。您可以透過設定 外部索引鍵 關係,確保相關資料在不同資料表之間保持同步。

    • 頻繁更新,可能由多個使用者同時更新。 更新可能只會影響資料的一小部分,這使得每次寫入整個結構都浪費資源。您可以使用 SQL INSERTUPDATEDELETE 語句同時更新不同的項目,僅將變更的值寫入磁碟。您可以使用 InnoDB 資料表和 交易,防止寫入操作相互衝突,並在更新基礎資料時傳回一致的查詢結果。

  • 使用 MySQL 的效能最佳做法可以協助您的應用程式進行擴充,而無需進行重大的重寫和架構變更。如需 MySQL 效能的最佳做法,請參閱 最佳化。它提供了 SQL 調整、資料庫設計和伺服器設定的指南和提示。

  • 您可以透過學習 MySQL SQL 語句來避免重複發明輪子,以進行常見操作:查詢中要使用的運算子、大量載入資料的技術等等。某些語句和子句是 SQL 標準定義的基本語句的擴充。如需主要類別的語句,請參閱 資料操作語句資料定義語句SELECT 語句

  • 從 Python 發出 SQL 語句通常涉及宣告非常長、可能跨越多行的字串文字。由於 SQL 語句中的字串文字可以用單引號、雙引號括起來,或者包含任何這些字元,為了簡單起見,您可以使用 Python 的三引號機制來括住整個語句。例如

    '''It doesn't matter if this string contains 'single'
    or "double" quotes, as long as there aren't 3 in a
    row.'''

    您可以使用 '" 字元來三引號跨越多行的字串文字。

  • 快速、可擴充的 MySQL 應用程式的許多秘密,都涉及在設定程序的開始時使用正確的語法,也就是 CREATE TABLE 語句中。例如,Oracle 建議大多數資料表使用 ENGINE=INNODB 子句,並在 MySQL 5.5 及更新版本中將 InnoDB 設定為預設儲存引擎。使用 InnoDB 資料表可以啟用交易行為,有助於讀寫工作負載的可擴充性,並提供自動 當機復原。另一個建議是為每個資料表宣告一個數值 主要索引鍵,這提供了最快的方式來尋找值,並且可以作為其他資料表中相關值的指標 (外部索引鍵)。此外,在 CREATE TABLE 語句中,使用最緊湊的欄位資料類型來滿足您的應用程式需求,有助於效能和可擴充性,因為這使資料庫伺服器能夠在記憶體和磁碟之間移動較少的資料。