天天看點

笨辦法學 Python · 續 練習 45:建立 ORM練習 45:建立 ORM

練習 45:建立 ORM

原文: Exercise 45: Creating an ORM 譯者: 飛龍 協定: CC BY-NC-SA 4.0 自豪地采用 谷歌翻譯

這本書的 SQL 部分的最後一個練習是一個很大的跳躍。你使用一個資料庫知道了 SQL 語言的基礎知識。你也應該精通 Python 的 OOP。現在是時候組合這兩個,并建立一個對象關系管理器(ORM)。ORM 的工作是,使用簡單的 Python 類,并将它們轉換為資料庫表中存儲的行。如果你曾經使用過 Django,那麼你已經使用他們的 ORM 來存儲資料。在本練習中,你将嘗試逆向分析如何實作它。

挑戰練習

在現實世界中,如果一個為我工作的程式員打算建立自己的 ORM,我會說:“沒門,使用現有的。”工作環境不同于教育環境,因為有人付錢讓你完成一些事情。使用你的工作時間,來創造一個不能使你的雇主受益的事情,這是不正當的。但是,你自己的個人時間全部是你的,作為初學者,你應該嘗試重新建立盡可能多的經典軟體。

建立一個 ORM 将會讓你了解許多問題,關于面向對象概念和 SQL 之間的不一緻。有許多 SQL 可以模組化的東西,而類經常卡在這裡。還有一個問題,SQL 中的一切都是表。嘗試建立自己的 ORM 将會讓你深入了解 SQL 和 OOP,我建議花費大量的時間,盡你所能制作一個最好的 ORM。

你在 ORM 中應實作的一些主要功能有:

  • 從外部傳遞字元串到 ORM 應該是安全的。如果你使用 F 字元串來制作你的 SQL,那麼你就錯了。原因是,如果你執行

    f"SELECT * FROM {table_name}

    ,那麼有人可以從外部将

    table_name

    設定為 SQL,例如

    person; DROP TABLE person

    。你的資料庫很可能以這種方式運作,銷毀所有内容或更糟。有些資料庫甚至允許你在 SQL 中運作系統指令,這被稱為“SQL 注入”,你不應該在 ORM 中引入它。
  • 所有的 CRUD 操作,但在 Python 中實作。我建議你跳過

    CREATE TABLE

    部分,直到你讓其他的一切正常工作。簡單的

    INSERT

    SELECT

    UPDATE

    DELETE

    是易于制作的,但是從類定義建立資料庫綱要涉及到一些主流的 Python 黑魔法,使其真正有效。使用手工制作的

    .sql

    檔案建立你的資料庫,然後一旦讓其他東西正常工作,你可以嘗試綱要系統來替換

    .sql

    檔案。
  • 将 Python 類型比對到 SQL 類型以及新類型,來處理 SQL 類型。你可能會發現,你必須做一些雜技,将 Python 資料類型放到 SQL 表中。也許這太痛苦了,是以你最終會自己制作資料類型。這就是 Django 做的事情。
  • 事務是一個進階話題,但如果你可以實作它就試一試。

我也會說,在這個練習中,你可以從任意數量的項目借鑒功能。在設計時,請随意檢視 Django 的 ORM。最後,我強烈建議你首先僅僅實作一個 ORM,它可以處理你在本書的這個部分建立的小型資料庫。一旦你得到一個可以處理這個資料庫的東西,就可以将其推廣到任何資料庫。

深入學習

本書開頭提到了,Joe Celko 的

《”Smarties” SQL》

将會讓你了解,你需要了解的 SQL 的每一件事情。Joe 的書很好,會讓你遠遠超出這個小型速成課。